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 восстанавливает доступ в этой таблице.