Klucze, które nie mają wartości (tj. Są nil
) nie istnieją. myTable
jest pustym stołem w odniesieniu do Lua.
Możesz iterować po pustym stole, ale to nie będzie użyteczne.
Ponadto:
for key,value in myTable do --pseudocode
value = "foobar"
end
Ten "pseudokod" nie ma sensu. Nie można modyfikować tabeli, modyfikując zawartość zmiennej lokalnej; Lua nie działa w ten sposób. Nie można uzyskać odniesienia do wpisu w tabeli; możesz uzyskać tylko wartość z tabeli.
Jeśli chcesz zmodyfikować zawartość tabeli, musisz zmodyfikować tabelę w tabeli. Na przykład:
for key,value in pairs(myTable) do --actualcode
myTable[key] = "foobar"
end
Zwróć uwagę na użycie myTable
. Nie można modyfikować tabeli bez użycia samej tabeli w pewnym momencie. Niezależnie od tego, czy chodzi o tabelę dostępną poprzez myTable
, czy za pośrednictwem innej zmiennej, przechowujesz odniesienie do tabeli.
Generalnie modyfikowanie tabeli podczas jej iteracji może powodować problemy. Jednak Lua mówi:
Zachowanie next
jest niezdefiniowany, jeśli podczas przechodzenia, można przypisać dowolną wartość do nieistniejącego pola w tabeli. Możesz jednak zmodyfikować istniejące pola. W szczególności możesz wyczyścić istniejące pola.
Tak więc jest całkowicie poprawna modyfikacja wartości pola, które już istnieje. I key
oczywiście już istnieje w tabeli, więc można go modyfikować. Możesz nawet ustawić go na nil
bez żadnych problemów.
Zmienne w Lua nie są niczym więcej niż posiadaczami wartości. Tabele zawierają wartości; myTable[key]
zwraca wartość. Możesz zapisać tę wartość w zmiennej, ale zmiana zmiennej zmieni się na , a nie na wartość . Ponieważ tabele są przechowywane przez odniesienie, można zmienić zawartość tabeli w jednej zmiennej i zobaczyć zmiany w innej, ale jest to po prostu zawartość tabeli, a nie sama tabela.
Dodałbym, że modyfikowanie tabeli w tej samej pętli, której używasz do analizy par, jest uważane za "nieokreślone zachowanie" w Lua. Może działać w jednej implementacji Lua, ale nie w innej. Istnieją bezpieczniejsze alternatywy, takie jak użycie tabeli pomocniczej, aby zanotować zmiany, a następnie przeanalizować je, aby je zastosować. – kikito
@kikito: Nie w tym przypadku. Zaktualizowałem post, aby wyjaśnić. –