Selon le manuel de Lua, setmetatable fonctionne toujours comme dans Lua 5.0. Pourtant, pour une raison quelconque, lorsque je tente ce code dans Lua 5.1.5 et 5.3.1, il semble que le métatable n'est pas accessible:Metatable n'est pas indexé, même si setmetatable est utilisé
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())
Le premier cas fonctionne, mais dans le second cas, le je reçois la erreur qui suggère que le métatable n'est pas utilisé:
./lua: /test.lua:12: attempt to call method 'getString' (a nil value)
stack traceback:
test.lua:12: in main chunk
[C]: ?
Cela n'a rien à voir avec l'opérateur d'appel de méthode « : » que même obtenir la valeur de la méthode ne va pas au métatable.
print(inst.getString)
nil
Réglage __index dans l'objet de l'instance ne semble pas fonctionner bien. Cela signifie-t-il que __index est seulement vérifié dans la métabalise? – stands2reason
@ stands2reason Oui. Tous les métaméthodes doivent être dans le métatable. Vous voudrez peut-être lire la référence à leur sujet parce que c'est la première chose à dire à leur sujet: http://www.lua.org/manual/5.3/manual.html#2.4 – Rochet2