Problem
Podczas iteracji ponad a
zmieniasz to.
Wyjaśnienie problemu
Oznacza to, że po usunięciu elementu każda metoda zostanie wyrzucony, bo nagle liczba elementów a
zawiera jeden mniej. A zatem indeksowanie jest również odrzucane.
Gdybym tylko wykonać to:
a = [1,2,3,4]
a.each do
|thing|
puts thing
a.delete(thing)
end
dostanę wyjście [1,3]. Dzieje się tak, ponieważ:
Przed usunięciem 1 z listy, która jest na indeksie 0, 2 jest na indeksie 1. Po usunięciu 1, 2 ma indeks 0 zamiast 1, więc nie 2 to kolejny element, który jest powtarzany, ale 3!
Przy okazji można zdefiniować lokalną zmienną blokową, tak jak zrobiłem to z thing
, aby uzyskać dostęp do każdego elementu, który jest iterowany.
Rozwiązanie
W celu uzyskania tego, co chcesz, musisz utworzyć kopię i pracować nad tym.
a = [1,2,3,4]
b = a.clone
a.each do
|thing|
puts thing
b.delete(thing)
end
Teraz pozostaje taki sam podczas iteracji i zamiast tego zmienia się b. Więc na końcu tej pętli a = [1,2,3,4]
i b =[]
.
Po wymowie a = b
otrzymasz oczekiwany rezultat.
Oczywiście można to zaadaptować do otwierania elementów od tyłu. Po prostu upewnij się, że działasz na kopii, więc nie zmieniasz elementu podczas iteracji nad nim.
Co właściwie próbujesz osiągnąć? – Stefan
To, co próbowałem osiągnąć, to drukowanie każdego elementu tablicy po jej wyskoczeniu. Próbuję nauczyć się Rubiego przez e-książki i takie. Wygląda na to, że mam przed sobą dość drogi. –