2016-10-22 7 views
0

Auszug Betrachten:Modifizieren ein Array während der Iteration

a = [1, 2, 3, 4, 5] 
a.each { |e| a.shift ; p e ; p a } 

die Ausgänge:

1 
[2, 3, 4, 5] 
3 
[3, 4, 5] 
5 
[4, 5] 

Es offenbart, dass die Umsetzung von each in Bezug auf einen Index durchgeführt wird (1 ist das Element an der Position 0 wenn gedruckt, 3 ist das Element bei 1 wenn gedruckt, und 5 ist das Element an Position 2 wenn gedruckt). Eine Alternative wäre 1, 2, 3 zu drucken.

Ist dieses Verhalten beabsichtigt? Oder ist es nur Implementierungsdetails, und es ist möglich, dass eines Tages Array wird neu implementiert und dieses Verhalten kann sich ändern?

+2

Diese Art der Sache passiert, wenn Sie Elemente aus einer Sammlung entfernen, über die Sie auflisten. Im Gegensatz dazu ist "a.dup.each {| e | eine Schicht ; p e; p a} 'druckt '" 1 \ n [2, 3, 4, 5 \ n2 \ n [3, 4, 5] \ n3 \ n [4, 5] \ n4 \ n [5] "'. . –

Antwort

0

Ja, das ist ein bekanntes Verhalten.

Es ist wahrscheinlich, dass das Verhalten der Implementierung Grund zurückzuführen ist, das heißt, Effizienz etc.

Aber ob es nur Detail Umsetzung nicht viel Bedeutung hat. Ruby-Entwickler sind besorgt, die Rückwärtskompatibilität nicht zu zerstören, und es ist sehr unwahrscheinlich, dass solch ein grundlegendes Verhalten geändert wird. Selbst wenn sie weitergehen würden, hätten sie eine ziemlich lange Übergangszeit.

Unabhängig davon ist es normalerweise nicht gut, ein Array während der Iteration vom Standpunkt der Lesbarkeit zu ändern. In den relevanten Fällen ist es wahrscheinlich, dass Sie das Array duplizieren sollten.

+0

Sie sind ziemlich besorgt über Rückwärtskompatibilität mit altbekanntem Verhalten, aber mit Randfällen wie diesem? Du hast Recht, nicht wirklich. – tadman

Verwandte Themen