2011-06-24 138 views
0

私はアレイの動作を誤解Rubyの配列奇妙な行動

私は

matrix, cell = [], []; 5.times { cell << [] } # columns 
3.times { matrix << cell } # lines 
matrix 
sample_data = (0..5).to_a 
matrix[1][2] = sample_data.clone 
matrix.each { |line| puts "line : #{line}" } 

このマトリックスを作成したとき、私はこの結果

line : [[], [], [0, 1, 2, 3, 4, 5], [], []] 
line : [[], [], [0, 1, 2, 3, 4, 5], [], []] 
line : [[], [], [0, 1, 2, 3, 4, 5], [], []] 

に代わりに予想される結果

line : [[], [], [], [], []] 
line : [[], [], [0, 1, 2, 3, 4, 5], [], []] 
line : [[], [], [], [], []] 

何を持っています違う ?

答えて

6

問題は、あなたの行である:

3.times { matrix << cell } 

あなたはmatrixの3行として同じオブジェクトcellを使用しています。

キーは、Arrayが可変オブジェクトです。たとえそれを変更しても、そのIDは変更されません。 cellの3つの発生は、同じインスタンス(オブジェクト)を指しています。あなたがそれを一度にアクセスして変更すると、他の発生はその変更を反映します。

あなたはこの行を変更した場合:

3.times { matrix << cell.dup } 

あなたが希望する結果を取得します。

+0

またはセルが空であるので、セルを指定する代わりに新しい[]を使うだけです... '3x {matrix << []}' – DGM

2

同じオブジェクト(セル)を行列に3回配置しています。

これはあなたのバグ修正されます:...

3.times { matrix << cell.clone } # lines 

を...しかし、あなたは、あなたがより良い方法があるかもしれないとして、このコードで解決しようとしている何の問題を説明することがあります