1:lua 元表(Metatable)
为了关联两个表,解决无法对两个table进行操作的问题
Setmetatable(table,metatable):对指定的table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable 会失败。
getmetatable(table): 返回对象的元表(metatable)。
如何对指定的表设置元表:
(1)mytable = {} --普通表
mymetatable = {} --元表
setmetatable(mytable,mymetatable) --把mymetatable 设为mytable的元表
(2)mytable = setmetatable({},{})
getmetatable(metatable) --返回mymetatable
2:元方法 __index
当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
other = {foo=3}
t= setmetatable({ },{__index= other})
t.foo => 3 t.bar => nil
如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。
metatable = setmetatable({key1= "value1"},{
__index = function(mytable,key)
{
if key == "key2" then
return "metatablevalue"
else
return nil
}
})
相等于
mytable = setmetatable({key1= "value1"},{__index= {key2= "metatablevalue"}})
print(metatable.key1,mytable.key2) => value1,metatablevalue
Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。
3:__newindex元方法
_newindex 元方法用来对表更新,__index则用来对表访问。当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
以下实例演示了 __newindex 元方法的应用:
mymetatable = {}
mytable = setmetatable({key1= "value1"},{__newindex=mymetatable})
print(mytable.key1) =>value1
mytable.newKey = "新值2"
print(mytable.newKey,mymetatable.newKey) =>nil,新值2
以上实例中表设置了元方法 __newindex,在对新索引键(newkey)赋值时(mytable.newkey = "新值2"),会调用元方法,而不进行赋值。而如果对已存在的索引键(key1),则会进行赋值,而不调用元方法 __newindex。
以下实例使用了 rawset 函数来更新表:
mytable = setmetatable({key1="value1"},{
_newindex = function(mytable,key,value)
rawset(mytable,key,'\'..value..'\')
end
}
)
mytable.key1 = "new value"
mytable.key2 = 4
print(mytable.key1,mytable.key2) => new value "4"
rawset 对于有__newindex元方法,调用rawset(t, k, v)函数可以不涉及任何元方法而直接设置table 中与key 相关联的value
rawget是为了绕过__index而出现的,就是让__index方法无效
4:为表添加操作符
5:__call 元方法
6:__tostring
https://www.runoob.com/lua/lua-metatables.html 菜鸟教程链接