Ruby: Comment parcourir une plage, mais par incréments définis?

156

Donc, je suis en train d'itérer sur une plage comme ceci:

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

Mais ce que j'aimerais faire, c'est itérer par 10.

Donc au lieu d'augmenter nde 1, le suivant nserait en fait 10, puis 20, 30, etc.

Shpigford
la source
1
Possible duplication stackoverflow.com/questions/2583665/about-ruby-range
Diego Dias
@DiegoDias mais cela a le meilleur et puis ce fil
Jackson Jegatheesan

Réponses:

256

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

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

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end
Berin Loritsch
la source
12
Cette réponse m'a conduit à ce que je cherchais ... Si vous avez deux fois, vous pouvez le faire(time1..time2).step(15.minutes) do |time|
daybreaker
12

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
Arup Rakshit
la source
6

Voici une autre façon, peut-être plus familière, de le faire:

for i in (0..10).step(2) do
    puts i
end
justsomeguy
la source
10
Désolé, mais le guide de style rubis déconseille fortement les forboucles d' utilisation .
Darth Egregious
@DarthEgregious pourquoi est-ce?
Doug
C'est une extension de la philosophie selon laquelle chaque chose est un objet et chaque action est un appel de méthode. Donc, plutôt que d'utiliser une fonction intégrée pour boucler avec for, vous devriez utiliser la eachméthode.
Darth Egregious
5
rng.step(n=1) {| obj | block } => rng

Itère sur rng, en passant chaque nième élément au bloc. Si la plage contient des nombres ou des chaînes, un ordre naturel est utilisé. Sinon, step invoque succ pour itérer dans les éléments range. Le code suivant utilise la classe Xs, qui est définie dans la documentation au niveau de la 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

......

Jahan
la source