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ą, namesjest całkowicie nieistotny. Każde użycie nameswewną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ę namesstanie, 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
ipairsjest standardową funkcją Lua, która iteruje po liście. Ten styl forpętli, iterator pętli for, używa tego rodzaju funkcji iteratora. iWartość indeks wpisu tablicy. nameJest wartością w tym indeksie. Więc w zasadzie wykonuje dla ciebie dużo ciężkiej pracy.