Die normale Syntax für die Indizierung einer Tabelle ist t[val]
. Nur für String-Schlüssel bietet Lua eine alternative-Syntax, wobei t.foo
genau äquivalent zu t["foo"]
ist. Dies ist eine rein syntaktische Zweckmäßigkeit, der sogenannte "Syntax-Zucker". Es fügt keine Funktionalität hinzu, es gibt Ihnen nur eine weniger überladene Syntax für die Verwendung von Zeichenfolgen als benannte Felder.
Es gibt eine Menge von Strings Tasten dies für nicht:
t["hello_world"] => t.hello_world -- works
t["hello world"] => t.hello world -- oops, space in the string
t["5 * 3"] => t.5 * 3 -- oops
t['[10]'] => t.[10] -- oops
Im Grunde funktioniert es nur, wenn der String-Schlüssel ein gültiger Bezeichner sein würde.
Wieder Tabellen über []
indiziert sind, und in den meisten Fällen müssen Sie sie benutzen:
t = {
-- [key] = value
[10] = "ten", -- number key, string value
["print function"] = print, -- string key, function value
["sub table"] = {}, -- string key, table value
[print] = 111, -- function key, number value
["foo"] = 123, -- string key, number value
}
Nur wenn Sie einen String-Schlüssel verwenden, die als gültige Kennung (keine Leerzeichen funktionieren würde, enthält nur Wortzeichen, Zahlen oder Unterstreichungen und beginnt nicht mit einer Zahl) können Sie die Abkürzungssyntax verwenden. Für die obige Tabelle wäre das nur 'foo':
t = {
-- [key] = value
[10] = "ten", -- number key, string value
["print function"] = print, -- string key, function value
["sub table"] = {}, -- string key, table value
[print] = 111, -- function key, number value
foo = 123, -- string key, number value
}
Also ist es im Grunde eine syntaktische Weise, zwischen "dem Wert von var" und dem "var Wert" zu unterscheiden :) Danke für deine Antwort, denke ich Ich verstehe jetzt. Ich denke, ich bevorzuge Rubys Art, Dinge zu tun (es erfordert immer den vollständigen Schlüssel, keine Abkürzungen, aber hat eine Abkürzungssyntax für identifizierbare Zeichenketten) – kikito