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.



@DiegoDias mais cela a le meilleur et puis ce fil
Jackson Jegatheesan

Réponses:



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

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

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

......

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.