数组
一般以1为起始索引,因为Lua库和长度操作符都遵循这个约定,如果数据不是从1开始,就无法试用这些功能
元表
假设a和b都是table,通过元表可以定义计算表达式 a + b,当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否有一个叫 __add的字段,一般是方法。如果Lua找到了该字段,就调用该字段对应的值,这个值就是所谓的“元方法”。
local meta = {
__add = function()
print("123")
end
}
local a = {}
setmetatable(a, meta)
local b = {}
local c = a + b -- 123
“__add" = 加法
“__mul” = 乘法
“__sub” = 减法
“__div” = 除法
“__unm” = 相反数
“__mod” = 取模
“__pow” = 乘幂
“__concat” = 连接操作符的行为
关系类的元方法
“__eq"等于,”__lt"小于,"__le"小于等于,其它3个关系操作符没有单独的元方法,lua将 a ~= b 转换为 not (a==b),以此类推, 大于 a > b 为 not (a <=b)
这种转换遇到”部分有序“就会发生错误,指对一种类型而言,不是所有的值都能排序,比如计算机中的 NaN 值,标准规定了任何涉及 NaN的比较都应返回 false,即 x > NaN 或 x <= NaN 都是 false
保护元表
假设想要保护集合的元素,使用户既不能看也不能修改集合的元素,就需要用到字段"__metatable",当设置了该字段时, getmetatable就会返回这个字段的值,setmetatable则会引发一个错误
__index
访问一个table 中不存在的字段时,解释器会去查找一个叫__index 的元方法,如果没有,则为nil,否则,则由这个元方法提供最终结果,_index 不一定是一个方法,也可以是一个 table ,当为table时,访问一个不存在的变量会先找到 _index , Lua就会在这个table里继续查找
不想在访问一个table 时涉及到它的__index元方法,则可使用函数 rawget( t , i )
__newIndex 元方法
与__index类似,不同之处是 __index用于table 的查询,__newIndex用于table 的更新。当对一个table 中不存在的索引赋值时,解释器会查找__newIndex元方法,如果有这个方法,解释器就不执行赋值而是调用它。如果这元方法是一个table,解释器就在此table中执行赋值,而不是对原来的table。
不想涉及__newIndex则使用 rawset( t , i )