Il tuo problema è semplice:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Questo codice dichiara prima una variabile globale chiamata names
. Quindi, avvia un ciclo for. Il ciclo for dichiara una variabile locale che viene chiamata names
anche per caso; il fatto che una variabile fosse stata precedentemente definita con names
è del tutto irrilevante. Qualsiasi utilizzo names
all'interno del ciclo for farà riferimento a quello locale , non a quello globale.
Il ciclo for dice che la parte interna del ciclo verrà chiamata con names = 1
, quindi names = 2
e infine names = 3
. Il ciclo for dichiara un contatore che conta dal primo all'ultimo numero e chiamerà il codice interno una volta per ogni valore che conta.
Quello che volevi davvero era qualcosa del genere:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
La sintassi [] è il modo in cui accedi ai membri di una tabella Lua. Le tabelle Lua associano le "chiavi" ai "valori". Il tuo array crea automaticamente chiavi di tipo intero, che aumentano. Quindi la chiave associata a "Joe" nella tabella è 2 (gli indici Lua iniziano sempre da 1).
Pertanto, hai bisogno di un ciclo for che conti da 1 a 3, che ottieni. Si utilizza la variabile count per accedere all'elemento dalla tabella.
Tuttavia, questo ha un difetto. Cosa succede se rimuovi uno degli elementi dall'elenco?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Ora, otteniamo John Joe nil
, perché il tentativo di accedere a valori da una tabella che non esistono risulta in nil
. Per evitare ciò, dobbiamo contare da 1 alla lunghezza della tabella:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
Il #
è l'operatore lunghezza. Funziona su tabelle e stringhe, restituendo la lunghezza di entrambe. Ora, non importa quanto grande o piccolo names
sia, funzionerà sempre.
Tuttavia, esiste un modo più conveniente per scorrere una serie di elementi:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
è una funzione standard di Lua che itera su un elenco. Questo stile di for
ciclo, l'iteratore per ciclo, utilizza questo tipo di funzione iteratore. Il i
valore è l'indice della voce nell'array. Il name
valore è il valore in quell'indice. Quindi fondamentalmente fa molto lavoro per te.