Metatable не индексируется, даже если используется setmetatable

Согласно руководству по Lua, setmetatable по-прежнему работает так же, как и в Lua 5.0. Тем не менее, по какой-то причине, когда я пробую этот код в Lua 5.1.5 и 5.3.1, оказывается, что к метатаблице нет доступа:

ClassTable = {}
ClassTable.getString = function(self) 
  return self.x .. ""
end

inst = {}
setmetatable(inst, ClassTable)
inst.x = 7

--doens't work
assert(getmetatable(inst) == ClassTable)
print(inst:getString())

Первый случай работает, однако во втором случае я получаю ошибку, которая предполагает, что метатабель не используется:

./lua: /test.lua:12: attempt to call method 'getString' (a nil value)
stack traceback:
    test.lua:12: in main chunk
    [C]: ?

Это также не имеет ничего общего с оператором вызова метода ":", поскольку даже получение значения метода не попадает в метатаблицу.

print(inst.getString)
nil

1 ответ

Решение

Сделать стол inst доступ к метатаблицу, вам нужно использовать метаметод __index,

Таким образом, вы можете исправить код, добавив эту строку вверху ниже ClassTable.getString определение:

ClassTable.__index = ClassTable

Несмотря на название, метаметод __index не обязательно должен быть функцией: вместо этого он может быть таблицей. Когда это функция, Lua вызывает ее с таблицей и отсутствующим ключом в качестве аргументов. Когда это таблица, Lua восстанавливает доступ в этой таблице.

Другие вопросы по тегам