I den folgenden Ruby-Skript habe:Pushing Hash auf Array: letzte Hash Überschreiben vorherige Feldelemente
arr = ['bob', 'jack', 'smith']
array_of_hashes = Array.new
hash = Hash.new
arr.each do |item|
hash.clear
hash[:name] = item
array_of_hashes << hash
end
puts array_of_hashes
Dies gibt einen Array von Hashes, das: Namen Schlüssel alle aus dem letzten Elemente sind.
[
[0] {
:name => "smith"
},
[1] {
:name => "smith"
},
[2] {
:name => "smith"
}
]
Ich würde erwarten, dass es die folgenden zurückzukehren, aber ich bin fest versuchen, warum Element der letzte Hash, um herauszufinden, wird alle bisherigen Array-Elemente zu überschreiben:
[
[0] {
:name => "bob"
},
[1] {
:name => "jack"
},
[2] {
:name => "smith"
}
]
EDIT: Vielen Dank für deine Antworten. Es ist schön, einige verschiedene Methoden zu haben, um das Gleiche zu erreichen. Ich habe jede Lösung getestet und jede ist großartig. Am Ende benutzte ich das, das meinem ursprünglichen Code am ähnlichsten war; aber mein Anwendungsfall ist ein einfaches lokales Skript - es wird nicht in einer industriellen App verwendet - in diesem Fall würde ich wahrscheinlich eine andere Lösung wählen.
Vielen Dank für Ihren Beitrag Ed; Ich mag es wirklich, wie dieser Code den Fehler in meinem ursprünglichen Code deutlich macht - das heißt, ich hatte nur einen Hash, mit dem ich es zu tun hatte, und dieser Code erstellt einen neuen Hash für jedes Array-Element. – singularity
Ich bin froh, dass es geholfen hat, @singularity. Danke für die Verbesserung. –
Ich habe diese Antwort jetzt akzeptiert, weil es das ist, was ich getan habe. Es war der schnellste Weg von meinem ursprünglichen Code zu einem funktionierenden Skript. "Hash.new" muss im Wesentlichen im Block "arr.each" stehen. '.clear' wird ebenfalls nicht benötigt. Obwohl es vielleicht nicht die eleganteste Lösung ist, ist es für mein Szenario am praktischsten und erledigt die Arbeit. – singularity