2016-09-28 8 views
-1

以下は、Rubyのバグか完全に正常なのでしょうか?Rubyハッシュバグ、アノマリまたはノーマル?

> a = [1, 2, 3].zip([[]]*3).to_h 
=> {1=>[], 2=>[], 3=>[]} 
> a[1] << 2 
=> [2] 
> a 
=> {1=>[2], 2=>[2], 3=>[2]} 

私は唯一の鍵が1ある場所で2を追加するためのものとして、すべての値が2により追加取得することを期待しないでください。それはあなたがzipで二番目の配列を作成しているとき以来、期待されている

+3

Pythonでは、これは '[[]] * 3'が同じリスト(同じオブジェクト)の3つのリストになるために起こります。したがって、追加すると、すべてのキーに表示されます。 '[[]、[]、[]]'を使用してもこの問題は発生しませんが、Rubyが同じかどうかは分かりません。 –

+0

ハッシュの各値のオブジェクト_idは何ですか? –

+0

彼らはすべて同じ 'object_id'を持っています – Lokesh

答えて

4

は同じオブジェクトです:

ので
a = [1, 2, 3].zip([[]]*3) 
#=> [[1, []], [2, []], [3, []]] 
a.map{|aa| aa.last.object_id } 
#=> [70307853627580, 70307853627580, 70307853627580] 

、あなたはそのオブジェクトを更新しようとすると、それがオブジェクトaに反映されます:

a[0][1] << 2 
#=> [2] 
p a 
#=> [[1, [2]], [2, [2]], [3, [2]]] 

arrayを別々のオブジェクトで作成するには、代わりにブロックを渡すことができます。この方法は、ハッシュ、文字列や他のアレイなどの可変オブジェクトを使用しても安全である:

a = [1, 2, 3].zip(Array.new(3) { [] }) 
#=> [[1, []], [2, []], [3, []]] 
a[0][1] << 2 
#=> [2] 
p a 
#=> [[1, [2]], [2, []], [3, []]] 

私はアーロンPattersonのハッシュを持つようなシナリオについて語っthis articleを読むことをお勧めします。

+0

非常に良い詳細な説明1+ –

関連する問題