Lua установка индекса в metatable


Я пытаюсь сделать базовое наследование в 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 2
lua

1 ответ:

Вы перезаписываете mt, на строке 9, Когда вы переназначаете его. Это разрушает поле prototype.

Не усложняйте ситуацию, если это ваша первая попытка с этим материалом. Ваша функция __index будет делать то же самое, что и функция leting __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)

Обратите внимание, что LHS назначения не полностью количественно определяется во время оценки RHS, поэтому __index должен быть установлен на отдельной строке.