Je veux utiliser un pour-chacun et un compteur:
i=0
for blah in blahs
puts i.to_s + " " + blah
i+=1
end
Y a-t-il une meilleure façon de le faire?
Note: Je ne sais pas si blahs
est un tableau ou un hachage, mais je dois faire blahs[i]
ne le rendrait pas beaucoup plus sexy. J'aimerais aussi savoir comment écrire i++
en Ruby.
Techniquement, la réponse de Matt et Squeegy est arrivée en premier, mais je donne la meilleure réponse à paradoja, donc répartissez un peu les points sur SO. De plus, sa réponse avait la note sur les versions, qui est toujours pertinente (tant que mon Ubuntu 8.04 utilise Ruby 1.8.6).
J'aurais dû utiliser puts "#{i} #{blah}"
qui est beaucoup plus succinct.
Comme les gens l'ont dit, vous pouvez utiliser
each_with_index
mais si vous voulez des index avec un itérateur différent de "each" (par exemple, si vous voulez mapper avec un index ou quelque chose comme ça), vous pouvez concaténer des énumérateurs avec la méthode each_with_index, ou simplement utiliser with_index:
blahs.each_with_index.map { |blah, index| something(blah, index)}
blahs.map.with_index { |blah, index| something(blah, index) }
C'est quelque chose que vous pouvez faire à partir de Ruby 1.8.7 et 1.9.
[:a, :b, :c].each_with_index do |item, i|
puts "index: #{i}, item: #{item}"
end
Vous ne pouvez pas faire ça avec pour. J'aime généralement l'appel plus déclaratif à chacun personnellement de toute façon. En partie parce qu'il est facile de passer à d'autres formulaires lorsque vous atteignez la limite de la syntaxe for.
Oui ce est collection.each
faire des boucles, puis each_with_index
pour obtenir l'index.
Vous devriez probablement lire un livre Ruby car c'est fondamental Ruby et si vous ne le savez pas, vous aurez de gros problèmes ( essayez: http://poignantguide.net/Ruby/ ).
Tiré du code source Ruby:
hash = Hash.new
%w(cat dog wombat).each_with_index {|item, index|
hash[item] = index
}
hash #=> {"cat"=>0, "wombat"=>2, "dog"=>1}
Si vous n'avez pas la nouvelle version de each_with_index
, vous pouvez utiliser la méthode Zip
pour associer des index à des éléments:
blahs = %w{one two three four five}
puts (1..blahs.length).Zip(blahs).map{|pair|'%s %s' % pair}
qui produit:
1 one
2 two
3 three
4 four
5 five
Quant à votre question sur le fait de faire i++
Eh bien, vous ne pouvez pas faire cela en Ruby. Le i += 1
déclaration que vous avez faite est exactement comment vous êtes censé le faire.
La série énumération énumérable est jolie, Nice.
Si vous voulez obtenir un index de Ruby pour chaque, alors vous pouvez utiliser
.each_with_index
Voici un exemple pour montrer comment .each_with_index
travaux:
range = ('a'..'z').to_a
length = range.length - 1
range.each_with_index do |letter, index|
print letter + " "
if index == length
puts "You are at last item"
end
end
Cela va imprimer:
a b c d e f g h i j k l m n o p q r s t u v w x y z You are at last item
Si blahs
est une classe qui se mélange à Enumerable, vous devriez pouvoir faire ceci:
blahs.each_with_index do |blah, i|
puts("#{i} #{blah}")
end