Lua中元表的学习

--table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。
--元表(Metatable),允许我们改变table的行为,可以对两个table进行操作
--有两个很重要的函数来处理元表:
--setmetatable(table,metatable): 对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败。
--getmetatable(table): 返回对象的元表(metatable)
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
getmetatable(mytable);

other = {foo = 2}
t = setmetatable({},{__index = other})
print(t.foo) 
print(t.bar)
--[[
运行结果:
2
nil
--]]





--Lua查找一个表元素时的规则,其实就是如下3个步骤:
--1.在表中查找,如果找到,返回该元素,找不到则继续
--2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
--3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
lgstable = setmetatable({key1 = "value1"},
    {
        __index = function(lgstable,key)
            if "key2" == key then
                return "metatablevalue"
            else
                return nil
            end
        end
    })

print(lgstable.key1,lgstable.key2)
--运行结果:value1    metatablevalue
--以上代码等价于一下代码
lgstable = setmetatable({key1 = "value1"},
    {
    __index = {key2 = "metatablevalue"}
    })
print(lgstable.key1,lgstable.key2)






--__index元方法用来对表进行访问,__newindex原方法用来对表更新
--当你给表的一个缺少的索引赋值,
--解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
mymetatable = {}
mytable = setmetatable({key1 = "value1"},{__newindex = mymetatable})

print(mytable.key1)

mytable.newkey = "newkey1"
print(mytable.newkey,mymetatable.newkey)
--结果:nil    newkey1

mytable.key1 = "newkey1"
print(mytable.key1,mymetatable.key1)
--结果:newkey1    nil

--以上实例中表设置了元方法 __newindex,在对新索引键(newkey)赋值时(mytable.newkey = "新值2"),会调用元方法,而不进行赋值。
--而如果对已存在的索引键(key1),则会进行赋值,而不调用元方法 __newindex。

参考:http://www.runoob.com/lua/lua-metatables.html

码云上的相关工程:https://gitee.com/luguoshuai/LearnLua

猜你喜欢

转载自www.cnblogs.com/luguoshuai/p/9222199.html
今日推荐