Ecco una Lua 5.2.2 trascrizione, che mostra la dichiarazione e l'indicizzazione di una tabella:Perché i letterali di tabella sono trattati in modo diverso dai riferimenti di tabella in Lua?
> mylist = {'foo', 'bar'}
> print(mylist[1])
foo
Perché non è la seguente dichiarazione legale?
> print({'foo', 'bar'}[1])
stdin:1: ')' expected near '['
non posso pensare di qualsiasi altra lingua in cui un letterale non può essere sostituito per un riferimento (ad eccezione, ovviamente, quando è necessario un lvalue).
FWIW, mettere tra parentesi la tabella letterale rende la dichiarazione legale:
> print(({'foo', 'bar'})[1])
foo
+1; questo in realtà spiega la ragione. Non sono amico della barra di '' foo 'bar "=> foo (" bar ") però zucchero sintattico. – dualed
@dualed Beh, se il suo unico uso fosse per evitare una coppia di parents, sarei d'accordo, ma il vero potere di quello "zucchero" è evidente quando si progettano linguaggi specifici di dominio. Ad esempio, qualcosa come "Widget {w = 100, h = 10}" Warning "" overflow dello stack nel frobnicator! "' È una normale sintassi di Lua e può essere "analizzata" dalla funzione 'Widget' usando un po 'di trucco di chiusura molto facilmente , senza la necessità di scrivere un parser! Questo può essere molto utile quando si utilizza Lua come linguaggio di configurazione o per altre applicazioni in cui gli utenti finali non sono programmatori esperti o per creare linguaggi di descrizione dei dati personalizzati. –
Non sono assolutamente d'accordo, questo genere di cose confonde solo un utente, specialmente se commette degli errori. Il messaggio di errore non avrebbe mai avuto senso per loro. Mai. È più sicuro usare la sintassi Lua semplice, alcuni plist esistenti, xml, ini, lo si chiami o addirittura si crei il tuo e scrivi un vero parser per esso. – dualed