2016-09-27 6 views
-2

配列のハッシュを作成したいと思います。作成したオブジェクト間のリンクを解除する方法

私が行う場合は、この:

res = Hash[(1..5).zip Array.new(5, [])] 

私は、結果としてこれを取得します:

{1=>[], 2=>[], 3=>[], 4=>[], 5=>[]} 

それは大丈夫です。しかし、私がこの配列の1つを変更しようとすると、Rubyはそれらをすべて変更します。それはOKではありません。

私はこれを行う場合は、次の

res[1] << 1 

私は、結果としてこれを取得します:

{1=>[1], 2=>[1], 3=>[1], 4=>[1], 5=>[1]} 

私はのように、他の変異体を使用しようとしていた。

res = Hash[(1..5).zip Array.new(5, Array.new)] 
res = Hash[(1..5).zip Array.new(5, [].dup)] 
res = Hash[(1..5).zip Array.new(5, [].clone)] 
res = Hash[(1..5).zip Array.new(5, []).clone] 

しかし、彼らは与えました私は同じ結果です。

なぜですか?

+0

'RES =ハッシュ[(1..5)の.zip 5.times.map {[]}]' ' – mudasobwa

+0

のRES = Hash.new {:各アレイは、異なる物体であろうk | h [k] = [] if(1..5)=== k} 'はあなたが望むものを達成するための最良の方法です。 – mudasobwa

+2

この正確な問題とその解決方法は、 'Array :: new'といくつかの既存の[so]質問と回答のドキュメントでカバーされています。 –

答えて

2

ブロックをArray.newメソッドに渡して、異なるオブジェクトIDを持つ要素を取得します。 、H |

res = Hash[(1..5).zip(Array.new(n){[]})] 
関連する問題