aus dem Handbuch Lua Referenz: https://www.lua.org/manual/5.3/manual.html#3.4.9
Tabelle Bauer sind Ausdrücke, die Tabellen zu erstellen. Jedes Mal, wenn ein -Konstruktor ausgewertet wird, wird eine neue Tabelle erstellt. Ein Konstruktor kann verwendet werden, um eine leere Tabelle zu erstellen oder eine Tabelle zu erstellen und einige seiner Felder zu initialisieren. Die allgemeine Syntax für Konstruktoren ist
tableconstructor ::= ‘{’ [fieldlist] ‘}’
fieldlist ::= field {fieldsep field} [fieldsep]
field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
fieldsep ::= ‘,’ | ‘;’
Jedes Feld der Form [exp1] = exp2 in die neue Tabelle fügt einen Eintrag mit Schlüssel und Wert exp1 exp2. Ein Feld des Formularnamens = exp ist entspricht ["name"] = exp. Schließlich sind Felder der Form exp äquivalent zu [i] = exp, wobei i aufeinanderfolgende Ganzzahlen sind, die mit 1 beginnen. Felder in den anderen Formaten haben keinen Einfluss auf diese Zählung.
Wie Sie sehen etwas wie
method_map = {'idea_one' : party_animal:dance}
nicht möglich ist, weil es nicht gültige Syntax für Tabellen Konstrukteure.
Ersetzen: mit = und entfernen Sie das '', um es zu einem gültigen Ausdruck zu machen.
method_map = {idea_one = party_animal: Tanz} wird die Fehlermeldung
stdin vermeiden: 2: '}' erwartet (schließen '{' in Zeile 1) in der Nähe von ':'
Aber Sie werden eine andere Fehlermeldung über fehlende Funktionsargumente sehen.
Das liegt daran, dass der Doppelpunkt-Operator nur für Funktionsaufrufe und Definitionen gültig ist. Nicht für die Indizierung von Tabellenelementen, die Sie eigentlich machen möchten.
method_map = {idea_one = party_animal.dance}
wird keine Fehler verursachen.
Natürlich können Sie nicht auf party_animal durch Selbst dann zugreifen.
Wie können wir das erreichen? Der Aufruf von method_map:dance()
wird sich auf methodmap beziehen.
Aber wenn wir
method_map = {idea_one = function() return party_animal.dance(party_animal) end}
oder die äquivalent
method_map = {idea_one = function() return party_animal:dance() end}
mit dem syntaktischen Zucker mit dem Doppelpunkt-Operator schreiben, wir endlich das bekommen, was wir wollen.
Nun beziehen sich auf party_animal wenn wir method_map:dance()
method_map [1] [2] nennen. method_map [1] ist also nil, daher können Sie method_map [2] nicht indexieren. Selbst wenn method_map [1] eine Tabelle wäre, wäre method_map [1] [2] gleich Null und Sie können auch keine nil-Werte aufrufen. – Piglet
Das liegt daran, dass ich die falsche Syntax für die Tabelle verwende? – Matt
@MattDeacalionStevens Nein, dies liegt daran, dass Sie beim Erstellen einer Tabelle Zeichenfolgenschlüssel verwenden und versuchen, mit nummerierten Schlüsseln auf Werte zuzugreifen. 'table [1]' versucht auf Schlüssel zuzugreifen, die definiert sind mit: 'table [1] = foo' oder' table = {foo} '. Kurz gesagt, wenn Sie Schlüssel in '{}' weglassen, werden alle Werte mit Zahlen beginnend von * 1 * indiziert. 'table = {" a "," b "," c "}' führt zu 'table [1] ==" a "'. – Green