/ / Pousser un tableau dans un autre comme une valeur - ruby, tableaux, immuabilité

Pousser un tableau dans un autre comme valeur - ruby, arrays, immutability

Comment puis-je ajouter un tableau dans un autre tableau en tant que valeur et non en tant que référence? Ci-dessous un exemple illustré:

a = []
m = []
i = 1

# first loop
a[0] = i
a[1] = i + 1
m << a #=> [[1,2]]

i += 1

# second loop
a[0] = i
a[1] = i + 1
m << a #=> [[2,3],[2,3]]

Je m'attendais à quelque chose comme [[1,2],[2,3]] au lieu.

Réponses:

2 pour la réponse № 1

Vous pourrez peut-être mieux comprendre ce qui se passe ici en examinant les identifiants des différents objets.

a = []
a.object_id    #=> 2164985760
m = []
i = 1

Première boucle

a[0] = i       #=> 1
a[1] = i + 1   #=> 2
a.object_id    #=> 2164985760
m << a         #=> [[1,2]]
m.object_id    #=> 2165031720
m[0].object_id #=> 2164985760

Deuxième boucle

i += 1
a[0] = i       #=> 2
a[1] = i + 1   #=> 3
a.object_id    #=> 2164985760
m << a         #=> [[2, 3], [2, 3]]
m.object_id    #=> 2165031720
m[0].object_id #=> 2164985760
m[1].object_id #=> 2164985760

Maintenant, essayons à nouveau, avec juste un changement. Comme @sawa le suggère, ajoutez a = [] avant la deuxième boucle. (Les identifiants d'objet suivants seront bien sûr différents de ceux indiqués ci-dessus.)

a = []
a.object_id     #=> 2164690760
m = []
i = 1

Première boucle

a[0] = i       #=> 1
a[1] = i + 1   #=> 2
a.object_id    #=> 2164690760
m << a         #=> [[1, 2]]
m.object_id    #=> 2164655180
m[0].object_id #=> 2164690760

Deuxième boucle

a = []
a.object_id    #=> 2161060600
i += 1         #=> 2
a[0] = i       #=> 2
a[1] = i + 1   #=> 3
a.object_id    #=> 2161060600
m << a         #=> [[1, 2], [2, 3]]
m.object_id    #=> 2164655180
m[0].object_id #=> 2164690760
m[1].object_id #=> 2161060600

2 pour la réponse № 2

Remplace le premier m << a avec m << a.dup. Cela poussera une copie (ou duplicate) de a sur m, qui est différent de aalors quand vous modifiez a vous ne serez pas "modifier l'objet dans m. Une façon de voir cela est la suivante:

a = []
m = []
m << a
a << 0
m #=> [[0]]

x = a.dup
m << x
m #=> [[0], [0]]

a << 1
m #=> [[0, 1], [0]]

x << 2
m #=> [[0, 1], [0, 2]]

1 pour la réponse № 3

Attribuer a à un autre tableau.

m = []

i = 1
a = []
a[0] = i
a[1] = i + 1
m << a

i += 1
a = []
a[0] = i
a[1] = i + 1
m << a

0 pour la réponse № 4

Si vous vous attendiez à quelque chose comme [[1,2],[2,3]] En conséquence, après avoir bouclé, vous devriez probablement chercher à utiliser la fonctionnalité Ruby de .map faire une boucle et retourner un tableau.

Ainsi, vous n’aurez plus à vous soucier de la gestion des variables intermédiaires (ni même du compteur dans votre exemple):

loop_count = 2 # or whatever currently determines how many loops you make
m = (1..loop_count).map do |i|
[i, i+1]
end

m #=> [[1,2],[2,3]]