lua的元表与元方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua的元表与元方法相关的知识,希望对你有一定的参考价值。
setmetatable()函数设置元表,getmetatable()函数获取元表
给一个table添加元表:
t = {}
t_metatable = {__index = {key = "value"}}
setmetatable(t, t_metatable)
这个有什么用呢?
t里面是没有key这个键的,像这样定义了元表的话(__index是元方法,表示索引,他可以是一个table,也可以是一个function,如果是table的话就在table中取值,如果是function的话值为返回值,如果未定义__index则为nil)
就会找到元表里面去
print(t.key)
输出:value
Lua查找一个表元素时的规则,其实就是如下3个步骤:
- 1.在表中查找,如果找到,返回该元素,找不到则继续
- 2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
- 3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
上面的描述表示元表是可以嵌套的:
__index为一个函数,Lua就会调用那个函数,table和键会作为参数传递给函数,最终键值为函数的返回值(键是直接传进去的,如果嵌套了多个元方法,则只能传入上一层的表)
--只会传入上一层的table t = setmetatable({key = 1}, {__index = setmetatable({}, {__index = setmetatable({},{__index = function(t, key) if key == "key2" then return "abc" else return nil end end })})}) print(t.key2)
注意key可以传进去,但是table只能传上一层的。如果改为return t.key 的话返回为nil
但是如果这样的话:
t = setmetatable({key = 1}, {__index = setmetatable({}, {__index = setmetatable({key = 2},{__index = function(t, key) if key == "key2" then return t.key else return nil end end })})}) print(t.key2)
输出为 2
又如:
mytable = setmetatable({key1 = "value1"},{ __index = function(mytable, key) if key == "key2" then return mytable.key1 else return nil end end }) print(mytable.key1, mytable.key2)
这里打印都是value1,表示获取mytable成功。也即是说__index元方法会传入table和key。table只能传入上一层的
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是关于lua的元表与元方法的主要内容,如果未能解决你的问题,请参考以下文章