and, or, not 逻辑操作符返回的不一定是true和false,这点与C++不同,它返回的是对应表达式的运行结果
支持多重赋值
1 2
-- a为0, b为1, c为nil a,b,c = 0,1
控制结构
1 2 3 4 5 6 7
ifexpthen -- something elseifexpthen -- something else -- something end
1 2 3
while <exp is true> do -- something end
1 2 3
repeat -- something until <exp is true>
1 2 3
for var=exp1, exp2, exp3 do -- something end
1 2 3
for i,v inipairs(a) do -- something end
1 2 3
for i inpairs(a) do -- something end
二、函数
函数也是值
2.1 多重返回值
Lua中函数可以返回多个值,但有下面的特殊情况:
函数作为单独的语句时,会丢弃所有返回值
函数作为表达式的一部分时,只保留第一个返回值
在多重赋值中,函数作为最后一个表达式时,会保留尽可能多的返回值
将函数调用放在一对括号中,会迫使其只返回一个值
2.2 变长参数
1 2 3 4 5 6 7 8 9
functionadd(...) local ret = 0 for i,v inipairs({...}) do-- 或 for i,v in ipairs{...} do ret = ret + v end return ret end
print(add(1,2,9))
1 2 3
functionfoo(...) local a,b,c = ... end
1 2 3 4 5
-- 跟踪函数foo的调用 functionFooCallLog(...) print("Call foo:", ...) return foo(...) end
1 2 3 4 5 6 7 8 9 10 11 12
-- 使用函数select访问变长参数 functionadd(...) local ret = 0 for i = 1, select("#", ...) do-- select("#", ...)获取参数个数 localarg = select(i, ...) -- select(n, ...) 获取第n个参数 ret = ret + arg end return ret end
print(add(1,3,5))
2.3 闭合(Closure)函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
functionnewCounter()-- 该函数返回一个匿名函数 local i = 0 returnfunction()-- 在匿名函数内部,变量i是一个“非局部的变量” i = i + 1 return i end end
-- 跟踪Table访问的示例 local index = {} local mt={ __index = function(t, k) print(string.format("*access to element %s, value %s", k, t[index][k])) return t[index][k] end,
__newindex = function(t, k, v) print("*update of element " .. tostring(k) .. "to " .. tostring(v)) t[index][k] = v end }
functiontrack(t) local proxy = {} -- __index和__newindex都是在table中没有所需访问的index时才发挥作用 proxy[index] = t -- 类似多维数组 setmetatable(proxy, mt) return proxy end