2010-12-03 27 views
122

Je suis itérer sur une plage comme ceci:Ruby: Comment parcourir une plage, mais en incréments?

(1..100).each do |n| 
    # n = 1 
    # n = 2 
    # n = 3 
    # n = 4 
    # n = 5 
end 

Mais ce que je voudrais faire itérer de 10 années.

Ainsi, au lieu d'augmenter de 1 n, la prochaine n serait en fait 10, puis 20, 30, etc., etc.

+1

double possible http://stackoverflow.com/questions/2583665/about-ruby-range –

Répondre

217

Voir http://ruby-doc.org/core/classes/Range.html#M000695 pour l'API complète.

Fondamentalement, vous utilisez la méthode step(). Par exemple:

(10..100).step(10) do |n| 
    # n = 10 
    # n = 20 
    # n = 30 
    # ... 
end 
+8

Cette réponse m'a conduit à ce que je cherchais ... Si vous avez deux fois, vous pouvez faire '(time1..time2) .step (15.minutes) faire | time |' – daybreaker

5
rng.step(n=1) {| obj | block } => rng 

Répète RNG, en passant chaque élément n-ième au bloc. Si la plage contient des nombres ou des chaînes, l'ordre naturel est utilisé. Sinon, l'étape invoque succ. Pour parcourir les éléments de plage. Le code suivant utilise la classe X, définie dans la documentation de niveau classe.

range = Xs.new(1)..Xs.new(10) 
range.step(2) {|x| puts x} 
range.step(3) {|x| puts x} 

produit:

1 x 
3 xxx 
5 xxxxx 
7 xxxxxxx 
9 xxxxxxxxx 
1 x 
4 xxxx 
7 xxxxxxx 
10 xxxxxxxxxx 

Référence: http://ruby-doc.org/core/classes/Range.html

......

6

Vous pouvez utiliser Numeric#step.

0.step(30,5) do |num| 
    puts "number is #{num}" 
end 
# >> number is 0 
# >> number is 5 
# >> number is 10 
# >> number is 15 
# >> number is 20 
# >> number is 25 
# >> number is 30 
2

Voici une autre, peut-être plus familier à la recherche façon de le faire:

for i in (0..10).step(2) do 
    puts i 
end 
+9

Désolé, mais le guide de style ruby ​​décourage fortement le utilisez les boucles 'for'. – Fuser97381