" t1 .__ index = t2"之间的区别是什么?和" setmetatable(t1,{__ index = t2})"?

时间:2018-05-15 12:43:20

标签: oop lua lua-table metatable

我在其他代码中看到了这些东西,如果我理解正确,它应该像这样使用:

t1 = {}
t1.__index = t2 --1

function t1:new()
    local new = {}
    setmetatable(new, {__index = t1}) --2

    new.something = 0

    return new
end

但是他们真正做了什么以及为什么有不同的写作方式?

1 个答案:

答案 0 :(得分:2)

它们的写法不同,因为它们做了不同的事情。

t1 = {}
t2 = {a = 20}
meta = {__index = t2}
setmetatable(t1, meta)
print(t1.a) -- prints 20

请注意这里有3个表:meta,metatable,t2,它存储了我们想要设置的键at1t2中查找缺少的密钥。

metatable仅用于控制t1的行为,但是,为了使用更少的表,人们经常使用回退表(t2)作为元表(meta)所以它变得像

t1 = {}
t2_and_meta = {a = 20}
t2_and_meta.__index = t2_and_meta
setmetatable(t1, t2_and_meta)
print(t1.a) -- prints 20