132 votes

Compteur automatique en Ruby pour chaque ?

Je souhaite utiliser un "for-each" et un compteur :

i=0
for blah in blahs
    puts i.to_s + " " + blah
    i+=1
end

Existe-t-il une meilleure façon de procéder ?

Remarque : Je ne sais pas si blahs est un tableau ou un hachage, mais le fait d'avoir à faire des blahs[i] ne le rendrait pas beaucoup plus sexy. J'aimerais aussi savoir comment écrire i++ dans Ruby.


Techniquement, les réponses de Matt et de Squeegy sont arrivées en premier, mais je donne la meilleure réponse à paradoja pour répartir un peu les points sur SO. De plus, sa réponse contenait une note sur les versions, qui est toujours d'actualité (tant que mon Ubuntu 8.04 utilise Ruby 1.8.6).


Il aurait fallu utiliser puts "#{i} #{blah}" qui est beaucoup plus succincte.

190voto

paradoja Points 2295

Comme d'autres 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.

54voto

Alex Wayne Points 58113
[:a, :b, :c].each_with_index do |item, i|
  puts "index: #{i}, item: #{item}"
end

Vous ne pouvez pas faire cela avec for. De toute façon, je préfère généralement l'appel plus déclaratif à chaque personne. En partie parce qu'il est facile de passer à d'autres formes lorsque vous atteignez les limites de la syntaxe for.

10voto

Matt Rogish Points 11824

Oui, c'est collection.each pour faire des boucles, puis each_with_index pour obtenir l'index.

Vous devriez probablement lire un livre sur Ruby car il s'agit de Ruby fondamental et si vous ne le connaissez pas, vous allez avoir de gros problèmes (essayez : http://poignantguide.net/ruby/ ).

Tiré du code source de Ruby :

 hash = Hash.new
 %w(cat dog wombat).each_with_index {|item, index|
   hash[item] = index
 }
 hash   #=> {"cat"=>0, "wombat"=>2, "dog"=>1}

6voto

George Points 945

Si vous ne disposez pas de la nouvelle version de each_with_index vous pouvez utiliser la fonction 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

4voto

pope Points 520

En ce qui concerne votre question sur la réalisation de i++ mais il n'est pas possible de faire cela en Ruby. Les i += 1 La déclaration que vous avez eue est exactement ce qu'il faut faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X