Grundsätzlich haben Sie jedes Element in a
geändert, um die Liste selbst zu referenzieren. Die Liste wird sich selbst rekursiv Referenzierung:
a[0] # => a
a[0][0] # => a[0], which is a
a[0][0][0] # => a[0][0], which is a[0], which is a
...
(# =>
ist ein Rubyism für „diese Zeile ausgewertet“)
Je nachdem wie man es sehen es nicht unendlich ist. Es ist mehr oder weniger wie ein Stück Papier mit den Worten "Bitte umdrehen" auf beiden Seiten geschrieben.
Der Grund, dass Ruby [...]
druckt, ist, dass es clever genug ist, um zu entdecken, dass die Liste rekursiv ist und vermeidet, in eine Endlosschleife zu gehen.
Übrigens ist Ihre Verwendung von each
ein bisschen nicht idiomatisch. each
gibt die Liste zurück, und normalerweise weisen Sie diesen Rückgabewert keiner Variablen zu (da Sie bereits eine Variable haben, die darauf verweist, a
in diesem Fall). Mit anderen Worten, Ihr Code ordnet [0,1,2]
zu a
, dann Schleifen über a
(Einstellung jedes Element auf a
), dann weist a
zu a
.
Warum nicht? an der Position a [x] findest du ein, auf dem du wieder ein [x] nennen kannst, etc., etc. Dimensionalität hat immer auch mit Orthogonalität zu tun. Diese Prämisse ist hier nicht gegeben. – flq
Beachten Sie, dass dies nichts mit Blöcken zu tun hat. 'a = []; a [0] = a; a [1] = a; a [2] = a 'wird genau das gleiche Ergebnis haben. – sepp2k
Mit Blöcken können Sie (nicht ganz) ein unendliches dimensionales Array erstellen: 'blk = proc {| i | Array.new (10, & blk)}; a = Array.new (10, & blk) '. Dies führt jedoch zu einem SystemStackError, da Ruby keine unendliche Rekursion verarbeiten kann. – Nemo157