「t1.__index = t2」和「setmetatable(t1, {__index = t2})」有什么区别?

我在别人的代码中看到过这些东西,如果我理解正确,应该像这样使用:

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

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

    new.something = 0

    return new
end

但它们真正的作用是什么,为什么要有不同的写法呢?

点赞
用户4984564
用户4984564

它们写法不同是因为它们扮演不同的角色。

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

请注意这里有三个表格:meta,元表,t2存储键a,而t1是我们想要设置为在t2中查找缺失键的表格。

元表只是控制t1行为的目的,但为了使用更少的表格,人们经常使用回退表格( t2)作为元表( meta),这样就变成:

t1 = {}
t2_and_meta = {a = 20}
t2_and_meta.__index = t2_and_meta
setmetatable(t1, t2_and_meta)
print(t1.a) -- 输出 20
2018-05-15 13:06:57