Lua中元表的学习
Posted luguoshuai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Lua中元表的学习的主要内容,如果未能解决你的问题,请参考以下文章