lua基础简介

Posted 飞鹰技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua基础简介相关的知识,希望对你有一定的参考价值。

lua是一个简单的方便易用的脚本语言。



变量

lua是区分大小写,全局变量不需要创建(赋值即创建),访问未初始化的变量不会引起错误(值为nil);删除全局变量,只需将其赋值为nil即可;

以一个下划线开始,跟着一个或多个大写字母的标识符为保留的特殊标识符;

lua中下划线(_)为哑变量,可方便处理忽略部分函数返回值(多个返回值,只需其中一部分)如:

local _, j = string.find("123456", "23) --只关心结束,不关心起始

通过local创建的变量为局部变量


全局变量arg保存有脚本的启动参数:脚本名称位于索引0处,参数依次位于索引1、2...处;脚本前的选项则为负索引;

lua -e "sin=math.sin" test.lua a b

arg[-3]="lua"

arg[-2]="-e"

arg[-1]="sin=math.sin"

arg[0]="test.lua"

arg[1]="a"

arg[2]="b"



注释

lua使用--注释一行,块注释使用"--[["开始,"]]"结束



基础类型

lua中有nil, boolean, number, string, userdata, function, thread, table,八种基础类型;

函数type可根据参数的值返回对应的类型名称

a = 8; print(type(a))


boolean类型

取值(false,true);lua中将nil与false视为‘假’,其他值(包括数字0,与空字符串)都视为‘真’

10=="10":返回false(类型不同)


字符串类型

string 是不可变的值,使用一对单引号或双引号界定;

可使用一对匹配的方括号([[ ... ]],[==[ ... ]==]等,类似块注释),这种形式可跨行,同时不处理里面的转义序列;

字符串前放置#,获得字符串的长度(如,#str);

字符串使用两个点(..)进行连接(连接时,数字会自动转换为字符处理)

lua提供数字与字符串的自动转换,在字符串上应用算数操作时,会尝试转换成一个数字;

tonumber:字符串转数字

tostring:数字转字符串


table类型

table 关联数组,可通过除nil外的类型值做索引;没有固定大小,可动态添加任意数量的元素到一个table中;

  • a = {} 创建一个空table

  • days={"Sun", "Mon" ...}:则days[1]="Sun", days[2]="Mon";

  • w={x=0, y=1}:w.x或w["x"]的值为0

  • opnames={["+"]="add", ["-"]="sub"}:操作符与负数只能通过此方式初始化

a[“x”]=y; a.x=y是等价的;


删除一个条目

  • 置为nil即可a.x=nil (a["x"]=nil):无论x是否存在,都可以

  • table.remove(a, k):若k不存在,则会出错


数组通常以1作为索引的起始值;#a获取其长度(从1到第一个值为nil的索引位置),若数组有空隙(即删除过中间元素)则长度不准,可通过table.maxn来返回最大的正索引数;

  • 在尾部添加值a[#a+1]=v

  • 删除最后一个值a[#a]=nil



操作符

操作符优先级见下图

数字和字符串之外的其他类型只能进行相等于不等比较;字符串与数字进行大小比较时会导致错误(禁止);

不等为‘~=’:两个值具有不同的类型,则认为他们不相等;table、userdata、function只有引用同一个对象时(不同对象时,即使对象内容相同也不等)才会相等。


逻辑操作符and、or、not;前两个使用‘短路求值’,and优先级高于or;

and:若第一个操作数为假,则返回第一个操作数;否则返回第二个操作数;

or:若第一个操作数为真,则返回第一个操作数;否则返回第二个操作数;

x= x or v:等价于if not x then x=v end(x没有设置时,设置为v)

max = (x>y) and x or y:等价于C语言中的 (x>y)?x:y;




语句

lua中常规语句与C与Pascal中的类似。


赋值

lua中使用=进行赋值,除简单赋值外还能进行多重赋值。

多重赋值:先对等号右边所有元素求值,然后才赋值;lua总是将右边值的个数调整到与左边变量的个数相同,若值少于变量数,多余变量赋为nil;若值多余变量个数,则被丢弃掉。

x, y = y, x  --交换x与y


if语句

if语句后必须跟then,最后以end结束

if [Condition] then

...

[elseif]

...

[else]

...

end


while语句

while [Condition] do

...

end


repeat语句

repeat 

...

until [Condition]


for语句

1、数字型for

for var=begin,end,step do

...

end

[step]可省略(默认为1);三个表达式是在循环开始时一次性求值(以后不再进行求值)。

2、泛型for

通过一个迭代器(iterator)函数遍历所有的值;当第一个返回值为nil时,循环终止

for <var-list> in <exp-list> do  -- list都是以逗号分隔

...

end

for先对in后面的表达式求值,并保存三个值:迭代器函数、恒定状态和控制变量的初值(多余丢弃,不足使用nil)

ipairs类似如下:

local function iter(a, i) ... return i+1,v end

function ipairs(a) return iter, a, 0 end

for就是依次调用iter(a,0), iter(a,1) ...


ipairs(i,v in ipairs(a))是Lua提供的一个用于数组的迭代器函数;[i]为索引值(从1开始,所以不要定义不是从1开始的数组),[v]为对应位置的数字值;

其他迭代函数:

  • io.lines:文件中的每一行

  • pairs:table元素

  • string.gmatch:字符串中单词


语句块

do ... end

定义一个语句块,基本等同于C++中{...}



函数

[local] function FunName(param1, ...);返回值由return决定,return语句后面的内容不要使用圆括号(使用圆括号会改变语义);

table.unpack():用于返回数组中所有元素

function foo0() return end // 无输出

function foo3() return 1,2,3 end // 1,2,3

function enclosure0 return (foo0()) end  // nil

function enclosure3 return (foo3()) end  // 1


变长参数(...)

所有参数被收集到变长参数中(...);固定参数必须在变长参数前

function VarTest(...)

for i=1, select("#", ...) do -- #为获取变参长度

ag=select(i, ...) -- 获取第n个数

print(ag)

end

end


尾调用消除(tail-call elimination):当函数最后一个动作是return另外一个函数(只能是直接返回函数,不能有任何特殊处理,包括加圆括号)时,不会耗费任何栈空间(相当于goto)



编译

loadfile:从文件中加载代码,并编译后将结果作为函数返回(调用返回函数即执行代码);

dofile:相当于调用loadfile后,执行返回的函数

load:与loadfile类似,只是从字符串中加载代码(代码直接加载到全局作用域:若定义了同名的全局与局部变量,则使用的是全局变量)

require:加载文件(类似其他语言的引用库,由lua从自己搜索加载目录的路径),若加载过则不会再次加载

i=32

local i=0

g=load("i=i+1; print(i)")

f=function () i=i+1; print(i) end

g() -->33 使用的全局变量

f() -->1 使用的local变量



错误error

Lua遇到任何未预期条件会引发错误(结束当前程序块并返回应用程序)

有两个函数处理错误:

assert:assert(expression, message)

error:error(message[, level]),level指示获取错误的位置并添加到message头部

1(默认):调用error位置(文件+行号)

2:调用error的函数

0:不添加位置信息


pcall(protect call)包装执行的代码,根据包装的代码执行结果返回不同值:

pcall(fun[, arg1, ...])

无错误:返回true

有错误:返回false,errorinfo


xpcall(fun, errHandle[, arg1, ...]):errHandle用于出错处理


debug库中提供了两个通用的错误处理函数:

debug.debug:提供Lua提示符,让用户检查错误原因

debug.traceback:根据调用栈构建一个扩展的错误消息


以上是关于lua基础简介的主要内容,如果未能解决你的问题,请参考以下文章

Lua学习基础入门

Lua学习基础入门

第六章第一节Lua编程基础

源码赏析带你零基础掌握Lua!

Lua 入门到精通( 01 Lua 简介以及软件安装)《做一个脚本高手》

Python爬虫编程思想(104):Splash基础(支持Lua的轻量级浏览器)