我尝试在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
不存在,但我不明白为什么。
答案 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
的原因。