J'utilise Ruby 1.9.2-P290 et j'ai trouvé:
b = Array.new(2) {Array.new}.each {|i| i.push("b")}
=> [["b"], ["b"]]
3 Réponses :
Ceci est un malentendu courant. Dans votre premier exemple, vous créez un tableau avec 2 éléments. Les deux sont un pointeur sur le tableau em> même em> (fort>. Ainsi, lorsque vous ithétiez dans votre ensemble externe, vous ajoutez 2 éléments à la matrice interne, qui est ensuite reflété dans votre sortie deux fois sur comparer ces: p> > array = Array.new(5, [])
=> [[], [], [], [], []]
# Note - 5 identical object IDs (memory locations)
> array.map { |o| o.object_id }
=> [70228709214620, 70228709214620, 70228709214620, 70228709214620, 70228709214620]
> array = Array.new(5) { [] }
=> [[], [], [], [], []]
# Note - 5 different object IDs (memory locations)
> array.map { |o| o.object_id }
=> [70228709185900, 70228709185880, 70228709185860, 70228709185840, 70228709185780]
Dans le premier cas, vous utilisez une seule instance d'un tableau comme valeur par défaut pour les éléments du tableau principal: Le deuxième argument est simplement recyclé, donc le La deuxième méthode est la bonne façon de le faire: P> Push code> est appliqué deux fois sur la même instance. Vous n'avez créé qu'une instance ici, celle fournie comme une dispute, elle est donc utilisée sur et plus. P> b = Array.new(2) { [ ] }.each {|i| i.push("b")
de la documentation RUBY:
new(size=0, obj=nil)
new(array)
new(size) {|index| block }