web-dev-qa-db-fra.com

Compteur automatique dans Ruby pour chacun?

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.

131
Dan Rosenstark

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.

188
paradoja
[: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.

54
Alex Wayne

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}
10
Matt Rogish

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
6
George

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.

4
pope

La série énumération énumérable est jolie, Nice.

2
Andrew Grimm

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
1
Ilyas karim

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
1
Roy Pardee