我在其他代码中看到了这些东西,如果我理解正确,它应该像这样使用:
t1 = {}
t1.__index = t2 --1
function t1:new()
local new = {}
setmetatable(new, {__index = t1}) --2
new.something = 0
return new
end
但是他们真正做了什么以及为什么有不同的写作方式?
答案 0 :(得分:2)
它们的写法不同,因为它们做了不同的事情。
t1 = {}
t2 = {a = 20}
meta = {__index = t2}
setmetatable(t1, meta)
print(t1.a) -- prints 20
请注意这里有3个表:meta
,metatable,t2
,它存储了我们想要设置的键a
和t1
在t2
中查找缺少的密钥。
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