首页 > 其他 > 详细

lua的元表与元方法

时间:2017-09-15 01:23:03      阅读:272      评论:0      收藏:0      [点我收藏+]

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的元表与元方法

原文:http://www.cnblogs.com/xzxdm/p/7028556.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!