Twój problem jest prosty:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Ten kod najpierw deklaruje globalną zmienną o nazwie names
. Następnie zaczynasz pętlę for. Pętla for deklaruje lokalną zmienną, która tak się akurat wywołuje names
; fakt, że zmienna została wcześniej zdefiniowana za pomocą, names
jest całkowicie nieistotny. Każde użycie names
wewnątrz pętli for będzie odnosić się do pętli lokalnej , a nie globalnej.
Pętla for mówi, że wewnętrzna część pętli zostanie wywołana names = 1
, a potem names = 2
, a wreszcie names = 3
. Pętla for deklaruje licznik, który odlicza od pierwszej do ostatniej liczby, i wywoła kod wewnętrzny raz dla każdej zliczanej wartości.
Właściwie chciałeś coś takiego:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Składnia [] określa sposób uzyskiwania dostępu do elementów tabeli Lua. Tabele Lua odwzorowują „klucze” na „wartości”. Twoja tablica automatycznie tworzy klucze typu całkowitego, których liczba wzrasta. Zatem klucz powiązany z „Joe” w tabeli to 2 (indeksy Lua zawsze zaczynają się od 1).
Dlatego potrzebujesz pętli for, która liczy od 1 do 3, którą otrzymujesz. Używasz zmiennej count, aby uzyskać dostęp do elementu z tabeli.
Ma to jednak wadę. Co się stanie, jeśli usuniesz jeden z elementów z listy?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Teraz otrzymujemy John Joe nil
, ponieważ próba uzyskania dostępu do wartości z tabeli, która nie istnieje, skutkuje nil
. Aby temu zapobiec, musimy policzyć od 1 do długości stołu:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
#
Jest operatorem długość. Działa na tabelach i łańcuchach, zwracając długość obu. Teraz, bez względu na to, jak duże lub małe się names
stanie, to zawsze będzie działać.
Istnieje jednak wygodniejszy sposób na iterację po tablicy elementów:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
jest standardową funkcją Lua, która iteruje po liście. Ten styl for
pętli, iterator pętli for, używa tego rodzaju funkcji iteratora. i
Wartość indeks wpisu tablicy. name
Jest wartością w tym indeksie. Więc w zasadzie wykonuje dla ciebie dużo ciężkiej pracy.