unity面试——Lua 元表

10 篇文章 0 订阅

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 菜鸟教程链接

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值