2010-07-19 4 views
5

Cela devrait-il être le cas, c'est-à-dire que je suis mal compris ou est-ce un bug?Est-ce un bug dans la méthode Array.fill dans Ruby?

a = Array.new(3, Array.new(3)) 
a[1].fill('g') 

=> [["g", "g", "g"], ["g", "g", "g"], ["g", "g", "g"]] 

devrait-il pas entraîner:

=> [[nil, nil, nil], ["g", "g", "g"], [nil, nil, nil]] 

Répondre

9

Array.new(3, Array.new(3)) retourne un tableau qui contient le même tableau à trois reprises (en d'autres termes: l'expression Array.new(3) est évaluée exactement une fois et aucune copie sont faites). Ce que vous voulez probablement, c'est Array.new(3) { Array.new(3) }, qui évalue trois fois Array.new(3) et vous donne ainsi un tableau de trois tableaux indépendants.

+0

fantastique, merci! –

0

Il est correct, Array.new(array) retourne un nouveau tableau créé avec des copies de taille de obj (qui est, les références de taille à la même obj)