Comment créer un tableau multidimensionnel en Ruby
Ruby ne fournit pas de support explicite pour les tableaux multidimensionnels, mais vous pouvez en implémenter un facilement avec des connaissances de base. Il faut créer un « tableau de tableaux » où chaque élément contient un autre tableau. Pour éviter la répétition, on écrit une méthode génératrice.
Créer un tableau multidimensionnel en Ruby
Étape 1 : Écrire le squelette de la méthode
Cette méthode prendra des arguments de dimension et renverra un tableau multidimensionnel vide. Pour un tableau 10×10, on appellera mda(10,10) :
def mda(width, height)
end
Étape 2 : Créer un tableau de width éléments
Étape 3 : Créer un tableau de height éléments pour chaque élément
Cela forme le « tableau de tableaux » servant de tableau à deux dimensions. Pour créer des tableaux vides d'une longueur précise, utilisez le constructeur Array.new avec la longueur en argument. Initialement, toutes les valeurs sont nil.
Étape 4 : Utiliser la méthode map!
map! itère sur chaque élément, exécute un bloc pour chacun et assigne le résultat à l'élément. Même résultat qu'une boucle for, mais plus concis :
def mda(width, height)
a = Array.new(width)
a.map! { Array.new(height) }
return a
end
Étape 5 : Utiliser l'opérateur d'indice (crochets [])
Par exemple, pour un tableau 10×10 nommé a et l'élément 7,3 : a[7][3] :
a = mda(10, 10)
# Remplir le tableau
a[7][5] = "une chaîne"
a[2][9] = 23
# Récupérer les valeurs
puts a[7][5]
puts a[2][9]
Étape 6 : Chaîner les appels de méthode
Ruby permet de chaîner les appels. Array.new renvoie un tableau sur lequel on peut chaîner un autre appel. Comme on chaîne, pas besoin de return ni de variable intermédiaire :
def mda(width, height)
Array.new(width).map! { Array.new(height) }
end
Astuce
Ruby est expressif. La méthode MDA peut tenir en une seule ligne concise. Les lignes et mots-clés superflus alourdissent le code. L'instruction return n'est pas obligatoire : les méthodes et blocs Ruby renvoient automatiquement le résultat de la dernière instruction exécutée.
