Je ne dis pas que Array
-> |value,index|
et Hash
-> |key,value|
n'est pas fou (voir le commentaire d'Horace Loeb), mais je dis qu'il y a une manière saine d'attendre cet arrangement.
Lorsque je traite des tableaux, je me concentre sur les éléments du tableau (pas sur l'index car l'index est transitoire). La méthode est chacun avec index, c'est-à-dire chaque + index, ou | chaque, index |, ou |value,index|
. Ceci est également cohérent avec l'index considéré comme un argument facultatif, par exemple | valeur | est équivalent à | value, index = nil | ce qui est cohérent avec | value, index |.
Lorsque je traite des hachages, je suis souvent plus concentré sur les clés que sur les valeurs, et je traite généralement les clés et les valeurs dans cet ordre, soit key => value
ou hash[key] = value
.
Si vous voulez taper du canard, alors utilisez explicitement une méthode définie comme l'a montré Brent Longborough, ou une méthode implicite comme l'a montré maxhawkins.
Ruby est tout au sujet de l'adaptation de la langue au programmeur, pas du programmeur de l'adaptation à la langue. C'est pourquoi il y a tant de façons. Il y a tellement de façons de penser à quelque chose. Dans Ruby, vous choisissez le plus proche et le reste du code est généralement extrêmement soigné et concis.
Quant à la question d'origine, "Quelle est la" bonne "façon d'itérer à travers un tableau dans Ruby?", Eh bien, je pense que la façon principale (c'est-à-dire sans sucre syntaxique puissant ou puissance orientée objet) est de faire:
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
Mais Ruby est tout sur le sucre syntaxique puissant et la puissance orientée objet, mais de toute façon voici l'équivalent pour les hachages, et les clés peuvent être commandées ou non:
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
Donc, ma réponse est: "La" bonne "façon de parcourir un tableau dans Ruby dépend de vous (c'est-à-dire du programmeur ou de l'équipe de programmation) et du projet.". Le meilleur programmeur Ruby fait le meilleur choix (quelle puissance syntaxique et / ou quelle approche orientée objet). Le meilleur programmeur Ruby continue de chercher d'autres moyens.
Maintenant, je veux poser une autre question, "Quelle est la" bonne "façon de parcourir une plage en Ruby à l'envers?"! (Cette question est de savoir comment je suis arrivé sur cette page.)
C'est agréable à faire (pour les attaquants):
(1..10).each{|i| puts "i=#{i}" }
mais je n'aime pas faire (pour l'arrière):
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
Eh bien, cela ne me dérange pas vraiment de faire ça trop, mais quand j'enseigne à reculer, je veux montrer à mes élèves une symétrie sympa (c.-à-d. Avec une différence minimale, par exemple en ajoutant seulement un inverse ou un pas -1, mais sans modifier quoi que ce soit d'autre). Vous pouvez faire (pour la symétrie):
(a=*1..10).each{|i| puts "i=#{i}" }
et
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
ce que je n'aime pas beaucoup, mais tu ne peux pas faire
(*1..10).each{|i| puts "i=#{i}" }
(*1..10).reverse.each{|i| puts "i=#{i}" }
#
(1..10).step(1){|i| puts "i=#{i}" }
(1..10).step(-1){|i| puts "i=#{i}" }
#
(1..10).each{|i| puts "i=#{i}" }
(10..1).each{|i| puts "i=#{i}" } # I don't want this though. It's dangerous
Vous pourriez finalement faire
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
mais je veux enseigner du Ruby pur plutôt que des approches orientées objet (pour l'instant). Je voudrais répéter en arrière:
- sans créer de tableau (considérez 0..1000000000)
- travailler pour n'importe quelle gamme (par exemple, les chaînes, pas seulement les entiers)
- sans utiliser de puissance supplémentaire orientée objet (c'est-à-dire sans modification de classe)
Je pense que cela est impossible sans définir une pred
méthode, ce qui signifie modifier la classe Range pour l'utiliser. Si vous pouvez le faire, veuillez me le faire savoir, sinon une confirmation de l'impossibilité serait appréciée, mais ce serait décevant. Peut-être que Ruby 1.9 y répond.
(Merci d'avoir pris le temps de lire ceci.)
array#each_with_index
utilise|value, key|
parce que le nom de la méthode implique l'ordre, alors que l'ordre utilisé pourhash#each
imite lahash[key] = value
syntaxe?