【问题标题】:What's difference between "t1.__index = t2" and "setmetatable(t1, {__index = t2})"?“t1.__index = t2”和“setmetatable(t1, {__index = t2})”有什么区别?
【发布时间】:2018-10-25 07:22:06
【问题描述】:

我在其他代码中看到过这个东西,如果我理解正确的话应该这样使用:

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

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

    new.something = 0

    return new
end

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

【问题讨论】:

    标签: oop lua lua-table metatable


    【解决方案1】:

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

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

    注意这里有 3 个表: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) -- prints 20
    

    【讨论】:

    • 所以我在在线IDE中尝试了。我想做的是类继承,setmetatable(Class, {__index = InheritedClass}) 工作得很好。这是正确的方法吗? tpcg.io/cOapGQ
    • 是的,这是正确的做法,但您可能仍然应该使用元表来真正了解它们的工作原理。在我看来,它们是普通 lua 中最强大的工具之一,如果不是 的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2010-12-18
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多