私は、次のRubyスクリプトがあります。アレイ上にハッシュを押す:最後のハッシュ上書き前の配列要素
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
これは、ハッシュの配列を返します:名前のキーが最後の要素からすべてのですが。
[
[0] {
:name => "smith"
},
[1] {
:name => "smith"
},
[2] {
:name => "smith"
}
]
私はそれが次のことを返すことを期待するだろうが、私は最後のハッシュ要素は、以前のすべての配列要素を上書きしている理由を理解しようとこだわっている:
[
[0] {
:name => "bob"
},
[1] {
:name => "jack"
},
[2] {
:name => "smith"
}
]
編集:ありがとうございましたあなたの答え。同じことを達成するためにいくつかの異なる方法を用意するのはいいことです。私はそれぞれのソリューションをテストしましたが、それぞれが素晴らしいです。私は元のコードに最も似ていたものを使用して終了しました。私の使用例はシンプルでローカルなスクリプトです - 産業規模のアプリケーションでは使用されていません - その場合、おそらく別のソリューションを選択します。
おかげでこれを試すことができます。私はこのコードが元のコードの欠陥を明確に示しているのが本当に好きです。つまり、私は1つのハッシュしか扱っておらず、このコードは各配列アイテムに新しいハッシュを作成します。 – singularity
私はそれが助けてくれることを嬉しく思っています。 upvoteありがとう。 –
私はこの回答を受け入れました。なぜなら、私がやったことです。私の元のコードから作業スクリプトまでの最速の方法でした。基本的に、 'Hash.new'は' arr.each'ブロック内になければなりませんでした。 '.clear'も必要ではありません。最も洗練されたソリューションではないかもしれませんが、それは私のシナリオにとって最も実用的であり、仕事を完了させます。 – singularity