2012-10-26 12 views

Odpowiedz

37

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.

+8

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

+4

@kikito: Nie w tym przypadku. Zaktualizowałem post, aby wyjaśnić. –

Powiązane problemy