2011-06-24 1 views
0

I comprennent mal le comportement Arraytableau Ruby comportement étrange

Lorsque j'ai créé cette matrice

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}" } 

J'ai ce résultat

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

En revanche, le résultat attendu

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

Qu'est-ce que faux ?

Répondre

6

Le problème est avec votre ligne:

3.times { matrix << cell } 

Vous utilisez le même objet cell que les trois rangées de matrix.

La clé est que Array est un objet mutable. Même si vous le modifiez, son identité ne change pas. Les trois occurrences de cell pointent vers la même instance (objet). Si vous y accédez et que vous le modifiez au cours d'une occurrence, les autres occurrences reflètent ce changement.

Si vous changez cette ligne:

3.times { matrix << cell.dup } 

alors vous obtiendrez le résultat souhaité.

+0

Ou puisque la cellule est vide, utilisez simplement un nouveau [] au lieu de spécifier une cellule ... '3times {matrix << []}' – DGM

2

Vous mettez le même objet (cellule) dans la matrice trois fois.

cela va résoudre votre bug:

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

... mais vous voudrez peut-être expliquer ce problème que vous essayez de résoudre avec ce code, car il peut y avoir de meilleures façons ...