Lua在metatable中设置__index

时间:2016-09-23 21:35:23

标签: object lua

我尝试在Lua中进行基本继承,但我并不完全理解为什么以下内容不会在我对mt.prototype的调用中对表print()编制索引。

local x = {}

mt = {}

mt.prototype = {
  value = 5,
}

mt = {
  __index = function (table, key)
    return mt.prototype[key]
  end,
}

setmetatable(x, mt)

print(x.value)

它说mt.prototype不存在,但我不明白为什么。

1 个答案:

答案 0 :(得分:3)

当您重新分配时,您将在第9行覆盖mt。这会破坏prototype字段。

如果你第一次尝试使用这些东西,那就不要复杂化。您的__index函数会执行与__index = tbl处理相同的操作。

local main_table = {}

local proto_table = {
    value = 5
}

setmetatable(main_table, { __index = proto_table })

print(main_table.value)

如果您想要稍微复杂的设置,请研究一下:

local main_table = {}

local meta_table = {
    prototype = {
        value = 5
    }
}

meta_table.__index = meta_table.prototype

setmetatable(main_table, meta_table)

print(main_table.value)

请注意,在RHS评估期间,分配的LHS未完全量化,这就是必须在单独的一行上设置__index的原因。