闭包
示例一
1 function newCounter() 2 local i = 0 3 return function() -- anonymous function 4 i = i + 1 5 return i 6 end 7 end 8 9 c1 = newCounter() 10 print(c1()) --> 1 11 print(c1()) --> 2
示例二
1 function myPower(x) 2 return function(y) return y^x end 3 end 4 5 power2 = myPower(2) 6 power3 = myPower(3) 7 8 print(power2(4)) --4的2次方 9 print(power3(5)) --5的3次方
Lua中的变量,如果没有local关键字,全都是全局变量,Lua也是用Table来管理全局变量的,Lua把这些全局变量放在了一个叫“_G”的Table里。
我们可以用如下的方式来访问一个全局变量(假设我们这个全局变量名叫globalVar):
1 _G.globalVar 2 _G["globalVar"]
MetaMethod
__add(a, b) 对应表达式 a + b
__sub(a, b) 对应表达式 a - b
__mul(a, b) 对应表达式 a * b
__div(a, b) 对应表达式 a / b
__mod(a, b) 对应表达式 a % b
__pow(a, b) 对应表达式 a ^ b
__unm(a) 对应表达式 -a
__concat(a, b) 对应表达式 a .. b
__len(a) 对应表达式 #a
__eq(a, b) 对应表达式 a == b
__lt(a, b) 对应表达式 a < b
__le(a, b) 对应表达式 a <= b
__index(a, b) 对应表达式 a.b
__newindex(a, b, c) 对应表达式 a.b = c
__call(a, ...) 对应表达式 a(...)
模块
- require(“model_name”)函数,载入同样的lua文件时,只有第一次的时候会去执行,后面都不执行了;
- dofile(“model_name”)函数,每一次文件都会执行;
- loadfile(“model_name”)函数,载入后不执行,等你需要的时候执行时;
1 local hello = loadfile("hello") 2 ... ... 3 ... ... 4 hello()
一行代码实现表的拷贝
1 u = {unpack(t)}
需要注意的是此法在表内条目大于2000时会失效。
一行代码判断表是否为空
用#t == 0
并不能判断表是否为空,因为#
预算符会忽略所有不连续的数字下标和非数字下标。
正确做法是:
if next(t) == nil then -- 表为空 -- ... end
因为表的键可能为false
,所以必须与nil
比较,而不直接使用~next(t)
来判断表是否空。
更快的插入代码
-- 更慢 table.insert(t, value) -- 更快 t[#t+1] = value
原因:[]和#
避免了高层的函数调用开销