6
votes

Pourquoi le comportement est-il comptant de la syntaxe de tableau.Nouveau une syntaxe?

J'utilise Ruby 1.9.2-P290 et j'ai trouvé:

b = Array.new(2) {Array.new}.each {|i| i.push("b")}
=> [["b"], ["b"]] 


0 commentaires

3 Réponses :


10
votes

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] 


0 commentaires

4
votes

Dans le premier cas, vous utilisez une seule instance d'un tableau comme valeur par défaut pour les éléments du tableau principal: xxx pré>

Le deuxième argument est simplement recyclé, donc le 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>

La deuxième méthode est la bonne façon de le faire: P>

b = Array.new(2) { [ ] }.each {|i| i.push("b")


0 commentaires

1
votes

de la documentation RUBY:

new(size=0, obj=nil)
new(array)
new(size) {|index| block }


0 commentaires