Ändern Eintrag in einem array, während die Schleife durch es
arr = ["red","green","blue","yellow"]
arr.each do |colour|
if colour == "red"
colour = "green"
end
end
puts arr.inspect
Den obigen code-Ausgänge:
["red", "green", "blue", "yellow"]
aber warum nicht?
["green", "green", "blue", "yellow"]
Dachte ich, die Farbe war ein Verweis auf das aktuelle element im array, und was auch immer ich Tat, es würde bewirken, dass die array-Elemente?
- Ich bearbeitet einen Kommentar Balg einschließlich mutation Objekte mit, die Sie verwenden können, index und erhalten gewünschten Ergebnis: arr.jede { |Farbe| colour[0..Farbe.length] = 'grün' if Farbe == 'red' }
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie innerhalb der
arr.each
block, dercolour
variable gebunden ist, eines der Objekte in derarr
array.Jedoch, sobald Sie die Zuordnung
colour = "green"
im block, jetzt diecolour
variable gebunden ist, ein neues Objekt (nämlich ein String mit einem Wert von"green"
), und die ursprünglichearr
bleibt unberührt.Einen Weg, um zu erreichen, was du redest, wäre:
denen manipuliert das array direkt.
.map
wäre wahrscheinlich besser.arr.map { |x| x == "red" ? "green" : x }
arbeiten würde, auch in Ordnung.Farbe ist in der Tat innitially eine Referenz auf das aktuelle element im array, aber mit 'Farbe="grün"' es jetzt verweist auf eine neue string. Die alte bleibt unverändert. Für das Experimentieren, versuchen, anstelle
mit einem oder mehreren
Alle die sich auf den vorhandenen string, und nicht eine neue erstellen.
In der Regel, um die Transformation eines Arrays in ein anderes array in Ruby, die Sie nicht verwenden
each
Methode, abermap
- Methode statt (code, durch den Benutzer sflinter oben):Oder, etwas allgemeiner, da die transformation anzeigen:
können wir etwas tun, wie
PS: Wie Phrogz unten vorgeschlagen,
map
erstellt eine neue Instanz des array, und wenn Sie geplant zu halten, das veränderte array in die gleiche variable, Sie sollten zuordnen das Ergebnismap
zu.Auf der anderen Seite, es ist
map
's böser Zwilling genanntmap!
ändert das ursprüngliche array in-place (Sie müssen also nicht erst weisen Sie zurück), das spart etwas Platz und Zeit, aber das brechen der reinen funktionalen Programmierung Konzept, dass die Funktionen sollten nicht Nebenwirkungen haben.map
Rückgabe ein neues array, und die müssen, weisen Sie es einer neuen Variablen, im Vergleich zu der Verfügbarkeit vonmap!
für in-place-mutation.Was ich bin, zu schreiben, ist nicht der empfohlene Weg, dies zu tun, beachten Sie aber, dass da die Saiten sind veränderlich in Ruby Sie schreiben, könnte der original-code wie folgt: