Question

Je suis confronté à quelque chose que je ne comprends pas pleinement.

J'ai un tableau dont les éléments sont des tableaux.

J'ai donc deux boucles imbriquées, dans la boucle intérieure, je remplit mon réseau intérieur puis dans la boucle extérieure, je remplit le réseau extérieur avec le réseau intérieur.

arr=[]
mat=[]
for m in (0..1)
  for k in (0..1)
    arr[k]=rand.to_s
  end
  mat[m]=arr
end

À la fin, ma matrice est remplie de deux tableau; Chaque tableau contient les valeurs calculées dans la dernière itération. Si je veux que le premier élément de Matrix contienne le premier tableau calculé, je dois réinitialiser l'objet ARR à chaque boucle. Il semble donc que l'affectation soit faite par référence jusqu'à ce que l'objet ARR soit "nettoyé". Si j'ajoute

mat[m]=arr
arr=[]

Tout fonctionne comme prévu: MAT [0] contiendra le tableau calculé dans la première boucle, et MAT [1] contiendra le tableau calculé dans la deuxième boucle.

Est-ce par conception ou est-ce un effet secondaire indésirable? Cela ne se produit que si j'attribue des tableaux en tant qu'éléments de tableau. Si si remplissez un tableau avec des variables de chaîne simples dans une boucle, tout va bien comme prévu.

Je sais que c'est une bonne pratique de programmation pour éviter de réutiliser des objets, mais ce comportement est de toute façon étrange.

Était-ce utile?

La solution

Votre problème est que le contenu de votre variable ARR est écrasé avec chaque itération: le arr[k] Écrasent ce qui est déjà là-dedans. La variable ARR doit être locale au bloc à la place:

mat = []
2.times do             # avoid for... use iterators instead
  row = []
  2.times do 
    row << rand.to_s
  end
  mat << row
end

Autres conseils

J'aime l'approche de en utilisant des hachages au lieu de tableaux multidimensionnels.

Que dis-tu de ça:

def creat­e_matrix x, y, conte­nt = nil, &block
  rows = (0...x­).to_a
  cols = (0...y­).to_a
  indices = rows.­product cols
  matrix = {}
  indices.ea­ch { |inde­x| matri­x[index] = ( block­_given? ? yield­( index ) : conte­nt ) }
  matrix
end

Alors fais:

matrix = create_matrix( 2, 2 ) { rand.to_s }

Vous obtiendrez un hachage, auquel vous pouvez accéder comme ceci:

matrix[[0, 1]] #note the double brackets

Une autre façon de le faire:

(1..4).map{rand}.each_slice(2).to_a
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top