---------------list start------------------
【LUA基本语法】
【LUA常用函数】
【技巧集】
【API reference】
【参考资料】
---------------list end--------------------
【LUA基本语法】
1.1 全局变量不需要声明
b = nil
删除一个全局变量
print(b) --> nil
1.2 退出LUA的方法
Ctrl-D(linux) Ctrl-Z(DOS/Windows) 调用OS库的函数 os.exit()
1.3 执行lua的chunk方法
执行一系列:lua -l -l
在交互模式下调用dofile函数 >dofile("")
1.4 注释
注意:Lua是大小写敏感的.
注释:单行注释:--
多行注释:--[[ --]]
1.5条件判断
在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。
对于Table,Function和Userdata类型的数据,只有 == 和 ~=可以用。相等表示两个变量
引用的是同一个数据。比如:
a={1,2}
b=a
print(a==b, a~=b) -- true, false
a={1,2}
b={1,2}
print(a==b, a~=b) -- false, true
1.6 连接运算符
print(10 .. 12) --> 1012
1.7 逻辑运算符
逻辑运算符认为false和nil是假(false),其他为真,0也是true.
and的优先级比or高。
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
如果x为false或者nil则给x赋初始值v
x = x or v
C语言中的三元运算符
a ? b : c
(a and b) or c
1.8 引用表中成员
w = {x=0, y=0, label="console"}
print(w.x) --> 0
print(w["x"]) --> 0
1.9 迭代器
function list_iter (t)
local i = 0
local n = table.getn(t)
return function ()
i = i + 1
if i <= n then return t[i] end
end
end
t = {10, 20, 30}
for element in list_iter(t) do
print(element)
end
1.10 for循环
- 第一种:数值循环
for var=exp1,exp2,exp3 do
loop-part
end
for将用exp3作为step从exp1(初始值)到exp2(终止值),执行loop-part。
其中exp3可以省略,默认step=1
- 第二种:范性for
for in do
end
是一个或多个以逗号分割的变量名列表,是一个或多
个以逗号分割的表达式列表,通常情况下exp-list只有一个值:迭代工厂的调用。
变量列表中第一个变量为控制变量,其值为nil时循环结束。
表达式应该返回范性for需要的三个值:迭代函数,状态常量和控制变量;
表达式返回的结果个数不足三个会自动用nil补足,多出部分会被忽略;
将状态常量和控制变量作为参数调用迭代函数;
迭代函数返回的值赋给变量列表。
1.11 错误处理
error函数抛出异常
assert调用抛出异常
pcall函数调用
1.12 协同程序
coroutine.create()
coroutine.resume(,[传给协同程序的参数列表])
resume函数的返回值除了true或false以外,还有yield的所有参数
1.13 __le和__lt __eq
一般实现__le后,还要实现__lt 和__eq
Set.mt.__lt = function (a,b)
return a <= b and not (b <= a)
end
Set.mt.__eq = function (a,b)
return a <= b and b <= a
end
1.14 有默认值的表实现(所有表共享同一个metatable)
local key = {} -- unique key
local mt = {__index = function(t) return t[key] end}
function setDefault (t, d)
t[key] = d
setmetatable(t, mt)
end
-->上面的写法,每一个表占用一个空间存储默认值d
tab = {x=10, y=20}
print(tab.x, tab.z) --> 10 nil
setDefault(tab, 0)
print(tab.x, tab.z) --> 10 0
1.15 只读的表实现
每一个只读代理有一个单独的新的metatable,使用__index指向原始表