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
> 

 

posted @ 2019-09-16 18:10  N_zero  阅读(222)  评论(0)    收藏  举报