2013-06-26 7 views
5

Ich fing an, Prototyp-basierte Programmierung in Lua zu lernen. Ich frage mich, wie Metatabellen ohne Metamethoden verwendet werden. Es gibt eine Zeile im Beispiel unten self .__ index = self wenn ich diese Zeile entferne somevalue ist in meinem neuen Objekt nicht sichtbar das ist normal, weil ich das metamethod __index nicht benutzt habe. Was nützt Metatabellen dann? Nur Metamethoden? Sorry für triviale Frage, aber das ist wirklich interessant, ich weiß, ich kann getmetatable verwenden, um die Metatable eines Objekts zu überprüfen. Ich brauche eine einfache Antwort: Es gibt keine Verwendung ohne Metamethoden oder es gibt (wenn ja dann was).Was ist die Verwendung von Metatables ohne Metamethoden?

-- Example taken from the official documentation. 
Account = { somevalue = 1 } 

function Account:new (o) 
    o = o or {} -- create object if user does not provide one 
    setmetatable(o, self) 
    --self.__index = self 
    return o 
end 

a = Account:new() 
print(a.somevalue) -- nil, so I can't use any features of the metatable till I use some metamethod? 

Antwort

4

Per Definition speichern Metatabellen Metamethoden. Dies bedeutet nicht, dass ein Metatable nur Metamethoden speichern muss; mehrere Bibliotheken verwenden sich selbst als Metatabellen.

Ein Metatable ist ein gewöhnlicher Lua-Tisch. Es wird nur die Metatabelle eines Objekts, wenn Sie als zweites Argument setmetatable aufrufen.

1

Nun ja, speichert Metatables die metamethods des Objekts, und das ist, was sie gesucht haben, um, zumindest habe ich keine andere usecase gesehen.

3

Sie können auch Schlüssel oder Werte oder beide schwach mit dem __mode Metatabelle Schlüssel machen, die einen String-Wert und keine Funktion (Methode)

meisten metamethods erklärt hier nimmt:

Einige Lua-API-Funktionen auch für spezielle Meta-Methoden testen, wie

  • __pairs - für Paare()
  • __ipairs - für ipairs()
  • __tostring - für Speicherbereinigungs
  • __metatable - - durch die toString() Funktion
  • __gc Aufruf durch den Set/getmetatable Funktionen gelesen (auch ein Wert)

Wenn Sie die manual-Datei für den bestimmten Namen suchen, einschließlich __ Sie t finden er vollständige Definition und Erklärung, kein Nutzen, es hier zu wiederholen.