原方法 __index:
作用用于访问元表中的内容。即当通过键来访问table时,如果这个键没有值,则lua会寻找该table中的 metatable 中的__index键。如果__index指向的是一个able,则lua会在__index指向的table中查找相应的键
Lua 查找一个元表的规则:
1、在表中查找,如果找到,则返回该键指向的值。如果找不到则继续
2、判断该表是否存在元表,如果没有,则返回nil。 如果有元表则继续
3、判断元表中是否存在__index 方法,如果 __index不存在则返回nil。如果__index 方法是一个table,则重复1、2、3. 如果__index 方法是一个函数,则返回该函数的值
1 -- 如果键值不存在则返回 0 2 mtb = setmetatable({},{__index=function(mtable,key) 3 return 0 4 end 5 })
-- 获取指定键的值,如果不存在该键则创建改建并赋给默认值0 mtb = setmetatable({},{__index=function(mtable,key) print("I'm here") rawset(mtable,key,0) end }) print(mtb.key) print(mtb.key)
原方法 __newindex:
与 __index 不同的是,__newindex 是用来对表进行更新的。
当对表不存在的一个key(索引)赋值时,解释器会查找 __newindex 元方法;如果存在则调用这个函数而不进行赋值操作。
-- 对一个表的键进行赋值,如果不存在该键值则插入键并且赋给用户指定的值 tb = setmetatable({}, {__newindex=function(bb,key,value ) rawset(bb,key,value) end})
元方法 | 说明 |
__add | 对应运算符“+” |
__sub | 对应运算符“-” |
__mul | 对应运算符“*” |
__div | 对应运算符“/" |
__mod | 对应运算符"%" |
__unm | 对应运算符"-" |
__concat | 对应运算符".." |
__eq | 对应运算符"==" |
__lt | 对应运算符"<" |
__le | 对应运算符"<=" |
这里的原方法与 C++中的运算符重载类似,不过在lua里面原方法的使用更加灵活
其他方法:
__call :当元组调用一个值时,进行调用
__tostring: 类似与 C# 中的 ToString 方法,用于改变元组输出的行为