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 № 1Vous 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 dup
licate) de a
sur m
, qui est différent de a
alors 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]]