2015-12-13 4 views
2

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épondre

2

Pour rendre la table inst accéder au métatable vous devez utiliser le métaméthode __index.

Vous pouvez donc corriger le code en ajoutant cette ligne en haut ci-dessous ClassTable.getString définition:

ClassTable.__index = ClassTable 

Malgré son nom, le métaméthode de __index ne pas besoin d'être une fonction: Il peut être table, à la place. Quand c'est une fonction , Lua l'appelle avec la table et la clé absente comme arguments . Quand c'est une table, Lua refait l'accès dans cette table.

+0

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

+1

@ 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