1、if代码块
x = 10 if x > 0 then print("x") elseif x = 0 then print("x") else print("x is a non-positive number") end
2、while代码块,lua没有提供do-while结构
x = 1 sum = 0 while x <= 5 do sum = sum + x x = x + 1 end print(sum) -->output 15
3、repeat代码块,until的条件为真时结束,这一点与其它语言有所区别
--死循环 x = 10 repeat print(x) until false
4、for循环
数字for(numeric for),第三个表达式step是可选的,表示增幅,默认为1
for i=1,10,2 do print(i) end -- output: 1 3 5 7 9
范型for(generic for)循环通过一个迭代器(iterator)函数来遍历所有值:
-- 打印数组a的所有值 local a = {"a", "b", "c", "d"} for i, v in ipairs(a) do print("index:", i, " value:", v) end -- output: index: 1 value: a index: 2 value: b index: 3 value: c index: 4 value: d
标准库提供了几种迭代器,包括用于迭代文件中每行的(io.lines)、迭代table元素的(pairs)、迭代数组元素的(ipairs)、迭代字符串中单词的(string.gmatch)等。
5、break和return关键字
break用在循环体中,用于跳出当前循环体,继续执行后面的代码
return用于从函数中返回结果,后面的代码都不会执行。
6、函数
在调用函数的时候,若形参个数和实参个数不同时,Lua会自动调整实参个数。调整规则:若实参个数大于形参个数,多余的实参被忽略;若实参个数小于形参个数,没有被实参初始化的形参会被初始化为nil。
function fun1(a, b) --两个形参,多余的实参被忽略掉 print(a, b) end function fun2(a, b, c, d) --四个形参,没有被实参初始化的形参,用nil初始化 print(a, b, c, d) end local x = 1 local y = 2 local z = 3 fun1(x, y, z) -- z被函数fun1忽略掉了,参数变成 x, y fun2(x, y, z) -- 后面自动加上一个nil,参数变成 x, y, z, nil -->output 1 2 1 2 3 nil
函数有两种表现形式
function add1(param1, param2) return param1 + param2 end local add2 = function(param1, param2) return param1 + param2 end add1(1, 2) add2(1, 2)
add1方法是一个全局函数,如果需要定义成局部的,需要在function前面加local定义
add2是将一个方法赋值给一个局部变量add2
两种形式都可以,我比较喜欢第二种,显示的定义局部函数,具有较好的阅读性。
7、函数变长参数
变长参数,lua支持变长参数,形参为...
function func(...) --形参为 ... ,表示函数采用变长参数 local temp = {...} --访问的时候也要使用 ... local ans = table.concat(temp, " ") --使用table.concat库函数,对数组内容使用" "拼接成字符串。 print(ans) end func(1, 2) --传递了两个参数 func(1, 2, 3, 4) --传递了四个参数 -->output 1 2 1 2 3 4
变长参数在lua5.2版本中做了一次升级
在lua5.1中,变长参数...默认会创建一个临时表arg,并且拥有一个全局属性n,通过arg.n获取可变参数的长度
local function test( ... ) num = arg.n return num end
由于可变参数创建的临时表会影响性能,在5.2版本中需要我们自己定义一个arg table,而且删除了arg.n这种直接得到可变参数个数的方法
local function test( ... ) arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local count = 0 for k,v in pairs(arg) do count = count + 1 end return count end
通过select方法获取可变参数中的指定位置的参数
句法:select(selector, ...)
select(“#”, ...):获取可变参数的长度
select(n, ...):截取第n个参数到结尾的列表
local arg = select(n, ...):可以取到第n个参数,后面的列表都被舍弃了
function foo(...) for i = 1, select('#', ...) do --get the count of the params local arg = select(i, ...); --select the param print("arg", arg); end end foo(1, 2, 3, 4) --output arg 1 arg 2 arg 3 arg 4
8、回调函数
将回调函数作为参数,传入其它方法中。
local m = {} local list = {name="hello",age=12} m.call_back_fun_print = function(printID) print(printID .. "-->" .. list[printID]) end m.add_list = function(key,value,call_back_fun) key = tostring(key) list[key] = value call_back_fun(key) end m.add_list("address","beijing",m.call_back_fun_print) --address-->beijing return m