2017-05-13 2 views
0

So scheint dieses Verhaltenunintuitive Verhalten von array.map

> array = (1..4).to_a 
=> [1, 2, 3, 4] 
> array.map {|a| [array.delete(array.first), array.delete(array.last)]} 
=> [[1, 4], [2, 3]] 
> array 
=> [] 

Aber dann logisch zu sein, wenn wir die Reichweite erhöhen funktioniert es nicht:

> array = (1..6).to_a 
=> [1, 2, 3, 4, 5, 6] 
> array.map {|a| [array.delete(array.first), array.delete(array.last)]} 
=> [[1, 6], [2, 5]] 
> array 
=> [3, 4] 

Und es macht das gleiche seltsame Verhalten mit ungeraden Nummern:

> array = (1..9).to_a 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9] 
> array.map {|a| [array.delete(array.first), array.delete(array.last)]} 
=> [[1, 9], [2, 8], [3, 7]] 
> array 
=> [4, 5, 6] 

Das war nicht was wir erwartet haben, warum verhält es sich so?

+2

Was erwarten Sie in den letzten zwei? Es wird allgemein als eine schlechte Idee angesehen, über etwas zu iterieren und es gleichzeitig zu modifizieren, es führt zu einem seltsamen und verwirrenden Verhalten, wenn man nicht sehr vorsichtig ist. –

Antwort

1

Dies ist eine Vermutung, da ich nicht sicher bin, ob dies der genaue Fall ist, aber ich kann das nicht als Kommentar setzen.

kann also Schritt für Schritt gehen:

Sie einen Array definiert:

> array = (1..6).to_a 
=> [1, 2, 3, 4, 5, 6] 

nun einen Iterator definiert:

array.map {|a| [array.delete(array.first), array.delete(array.last)]} 

so für die erste Iteration es array[0] als Wert nehmen für für Variable a und die Operation und damit löschen first und last Element des arra y.

Nach der ersten Iteration array wird [2,3,4,5].

Für die zweite Iteration wird array[1] als Wert für die Variable a verwendet und dasselbe wie in der ersten Iteration durchgeführt und das erste und letzte Element gelöscht. Jetzt ist array[3,4].

Jetzt für die dritte Iteration, gut hätte es nicht für die dritte Iteration versucht, wenn Ihr Original-Array nur Größe 2 war wie zB [2,3], aber da Sie Ihre ursprüngliche Array während der Iteration geändert haben, wird es versuchen, 3. Iteration seit ursprünglichen Array hatte Länge 6.

Für die dritte Iteration benötigt es das dritte Element des Arrays, d. H. array[2], aber Ihr aktuelles Array hat diesen Index nicht, so dass es das restliche Array ohne irgendeine andere Operation zurückgibt.

Es ist wirklich verwirrend, Array zu ändern, während iteriert wird.

Verwandte Themen