• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

unity面试——Lua 元表

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1:lua 元表(Metatable)
为了关联两个表,解决无法对两个table进行操作的问题
Setmetatable(table,metatable):对指定的table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable 会失败。
getmetatable(table): 返回对象的元表(metatable)。

如何对指定的表设置元表:
(1)mytable = {} --普通表
         mymetatable = {} --元表
         setmetatable(mytable,mymetatable) --把mymetatable 设为mytable的元表

(2)mytable = setmetatable({},{})
         getmetatable(metatable) --返回mymetatable

2:元方法 __index 

当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。

other = {foo=3}
t= setmetatable({ },{__index= other})
t.foo  => 3             t.bar  => nil

如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。

metatable = setmetatable({key1= "value1"},{
    __index = function(mytable,key)
    {
        if key == "key2" then
            return "metatablevalue"
        else
            return nil
    }
})

相等于

mytable = setmetatable({key1= "value1"},{__index= {key2= "metatablevalue"}})

print(metatable.key1,mytable.key2) => value1,metatablevalue

Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。

3:__newindex元方法

_newindex 元方法用来对表更新,__index则用来对表访问。当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作

以下实例演示了 __newindex 元方法的应用:
mymetatable = {}
mytable = setmetatable({key1= "value1"},{__newindex=mymetatable})
print(mytable.key1) =>value1

mytable.newKey = "新值2"

print(mytable.newKey,mymetatable.newKey) =>nil,新值2

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

以下实例使用了 rawset 函数来更新表:
mytable = setmetatable({key1="value1"},{
        _newindex = function(mytable,key,value)
            rawset(mytable,key,'\'..value..'\')
        end
    }
)

mytable.key1 = "new value"
mytable.key2 = 4
print(mytable.key1,mytable.key2) => new value "4"

rawset 对于有__newindex元方法,调用rawset(t, k, v)函数可以不涉及任何元方法而直接设置table 中与key 相关联的value

 rawget是为了绕过__index而出现的,就是让__index方法无效

4:为表添加操作符

5:__call 元方法

6:__tostring

https://www.runoob.com/lua/lua-metatables.html 菜鸟教程链接

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua学习——初识Lua发布时间:2022-07-22
下一篇:
LUA 字符串密码格式校验发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap