2011-09-07 10 views
5

gdy piszę następujący kod:rubin tablica Najdziwniejsze (nieskończony array)

x= [1,2,3] 
x << x 
puts x 
puts x[3] 
puts x[3][3][3][3][3][3][3][3][3][3] 

uzyskać ten wynik:

[1, 2, 3, [...]] 
[1, 2, 3, [...]] 
[1, 2, 3, [...]] 

nie powinienem dostać tylko [1,2,3, [1,2,3]] i jakie będzie wyjaśnienie?

Odpowiedz

10

Nie ma w tym nic dziwnego. Czwartym elementem tablicy jest sama tablica, więc gdy poprosisz o czwarty element, otrzymasz tablicę, a gdy poprosisz o czwarty element czwartego elementu, otrzymasz tablicę, a kiedy poprosisz o czwartą element czwartego elementu czwartego elementu czwartego elementu ... otrzymujesz tablicę.

To proste.

Jedyne co niecodzienne jest to, że Array#to_s wykrywa taką rekursję i zamiast wchodzić w nieskończoną pętlę, zwraca wielokropek.

+2

W Rubim 1.9, 'Array # <=>', '#eql?' I '# hash' również zajmują się rekursją, tak samo dla' Hash' i 'Struct' ... Nie wiesz, dlaczego uważasz to "niezwykłe"! http://blog.marc-andre.ca/2009/05/lost-in-recursion.html –

+0

Nie uważam, że "nieskończenie rekursywna matryca samo-odwołująca się" jest typowym przypadkiem użycia, który normalny programista powinien rozważyć:) Napisałem swój udział w implementacjach 'to_s', ale nigdy nie uważałem specjalnej obudowy dla * tego *. Jeśli ktoś prosi o reprezentację ciągów nieskończonej struktury danych, otrzyma nieskończoną pętlę. Kropka. Mam na myśli, że 'map' dla nieskończonego' Enumerator' zwraca nieskończenie dużą tablicę i nikt nie myśli o tym dwa razy, czy to nie jest tak samo? –

+0

Myślę, że to miłe, że Ruby radzi sobie z ładnymi strukturami rekursywnymi. Nie jestem pewien, czy są tak niezwykłe, np. struktury, które trzymają swojego rodzica i dzieci. Gdyby tak nie było, to przeliczanie byłoby wszystkim, co potrzebne do obsługi pamięci :-) –

7

Podczas pisania x << x dodajesz do x z odniesieniem do samego siebie, tworząc tablicę rekurencyjną/nieskończoną.

Porównaj to z x << x.dup, która dołącza kopię x do x. To jest równe [1,2,3,[1,2,3]]

+0

tak, to prawda, ale czy nie powinno być tak samo, gdy piszę "x + = x"? Mam na myśli stworzenie innego rodzaju tablicy rekurencyjnej. – Dragos

+0

'x + = x' jest równoważne' x = x + x', co oznacza, że ​​tworzymy nową tablicę łącząc elementy z 'x' z elementami z' x', a następnie 'x' odwołujemy się do tej nowo utworzonej tablicy więc kończysz na '[1, 2, 3, 1, 2, 3]'. '<<' przesuwa podany obiekt na koniec tablicy (nie jest tworzona nowa tablica). Zobacz [dokumenty dla +] (http://www.ruby-doc.org/core/classes/Array.html# M000271) i [dokumenty dla <<] (http://www.ruby-doc.org/core/classes/Array.html#M000225). – mikej

Powiązane problemy