lua 元表
有两个很重要的函数来处理元表:
- setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
- getmetatable(table): 返回对象的元表(metatable)。
> mytable = {} > mymetatable = {} > print(mytable) table: 0x24b8b80 > print(mymetatable) table: 0x24b8eb0 > setmetatable(mytable, mymetatable) > print(mytable) table: 0x24b8b80 > print(getmetatable(mytable)) table: 0x24b8eb0
> mytable2 = setmetatable({}, {}) > print(mytable2) table: 0x24ba120 > print(getmetatable(mytable2)) table: 0x24ba170
__index元方法(双下滑线)
> other = {foo = 3}
> t = setmetatable({}, {__index = other})
> print(t)
table: 0x24bb020
> print(other)
table: 0x24bac20
> print(getmetatable(t))
table: 0x24bb070 --不是other的地址
> print(foo)
nil
> print(other.foo)
3
> print(t.foo)
3
如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。
__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。
mytable = setmetatable({key1 = "value_1"}, {__index = function(mytable, key)
if key == "key2" then
return "metatable_value"
else
return nil
end
end
})
print(mytable.key1, mytable.key2)
实例解析:
-
mytable 表赋值为 {key1 = "value_1"}。
-
mytable 设置了元表,元方法为 __index。
-
在mytable表中查找 key1,如果找到,返回该元素,找不到则继续。
-
在mytable表中查找 key2,如果找到,返回该元素,找不到则继续。
-
判断元表有没有__index方法,如果__index方法是一个函数,则调用该函数。
-
元方法中查看是否传入 "key2" 键的参数(mytable.key2已设置),如果传入 "key2" 参数返回 "metatablevalue",否则返回 mytable 对应的键值。
> mytable = setmetatable({key1 = "value_1"}, {__index = {key2 = "metatable_value"}}) --实现的功能和上面的代码段是一样的。
> print(mytable.key1, mytable.key2)
value_1 metatable_value
>

浙公网安备 33010602011771号