2016-08-11 10 views
0

2次元配列を作成しました.2次元配列全体にこのように9が設定されています。ルビの2次元配列の要素の値を変更するには?

matrix = Array.new(5,(Array.new(5,9))) 

次に私は[0][0]位置に1を割り当てるいアレイ全体

puts "#{matrix}" # => [[9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9]] 

次のページを印刷しています。

matrix[0][0] = 1 

は、その後、私は再びので、行列

puts "#{matrix}" # => [[1, 9, 9, 9, 9], [1, 9, 9, 9, 9], [1, 9, 9, 9, 9], [1, 9, 9, 9, 9], [1, 9, 9, 9, 9]] 

を印刷しています、ここでのケースです!この割り当てによってすべての行が影響を受けている理由[0][0]の位置を変更するだけではいけません。 私はruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]を使用しています。

+0

ヒントは出力されています。 'matrix.each {| a | puts a.object_id} 'が返されます。 –

+0

彼らはすべて同じです!あなたのポイントを得ました –

+0

'matrix = Array.new(5、Array.new(5,9))'(余分な括弧は必要ありません)は 'arr = Array.new(5,9);と同じです。 matrix = Array.new(5、arr) 'となります。とった? –

答えて

5

基本的に、すべてのサブアレイで同じ配列参照を使用しています。

matrix = Array.new(5,(Array.new(5,9))) 

このコードは、その後5回使用された新しい配列を作成します。この

matrix = Array.new(5) { Array.new(5, 9) } 
+0

私は自分の宣言で何が起こっているのか理解しています。あなたの宣言は魅力的でした! –

1

問題のようにそれを行うには、あなたが5つの異なるアレイを作成していないということです。その後

matrix = [] 

5.times do 
    matrix.push(Array.new(5,9)) 
end 

:あなたが0に最初の配列のセルを設定するときに、あなたが実際にこれを修正するには0

にそれらすべてを設定するには、例えばこのように、個々の配列を作成する必要がありますコードは期待どおりに動作します。

matrix[0][0] = 5 
    puts matrix # [[5, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9]] 
+0

あなたの説明は本当に良いです! –

+0

それはうまく動作しますが、 '行列 'を作る慣用の方法は@ursusによって与えられます。 –

関連する問題