Lua笔记

闭包

示例一

 function newCounter()
local i =
return function() -- anonymous function
i = i +
return i
end
end c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2

示例二

 function myPower(x)
return function(y) return y^x end
end power2 = myPower()
power3 = myPower() print(power2()) --4的2次方
print(power3()) --5的3次方

Lua中的变量,如果没有local关键字,全都是全局变量,Lua也是用Table来管理全局变量的,Lua把这些全局变量放在了一个叫“_G”的Table里。

我们可以用如下的方式来访问一个全局变量(假设我们这个全局变量名叫globalVar):

 _G.globalVar
_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(...)

模块

  1. require(“model_name”)函数,载入同样的lua文件时,只有第一次的时候会去执行,后面都不执行了;
  2. dofile(“model_name”)函数,每一次文件都会执行;
  3. loadfile(“model_name”)函数,载入后不执行,等你需要的时候执行时;
 local hello = loadfile("hello")
... ...
... ...
hello()

一行代码实现表的拷贝

 u = {unpack(t)}

需要注意的是此法在表内条目大于2000时会失效。

一行代码判断表是否为空

#t == 0并不能判断表是否为空,因为#预算符会忽略所有不连续的数字下标和非数字下标。

正确做法是:

if next(t) == nil then
-- 表为空
-- ...
end

因为表的键可能为false,所以必须与nil比较,而不直接使用~next(t)来判断表是否空。

更快的插入代码

-- 更慢
table.insert(t, value) -- 更快
t[#t+] = value

原因:[]和#避免了高层的函数调用开销

上一篇:selenium 富文本框处理


下一篇:编程一小时 code.org [六一关注]