web-dev-qa-db-fra.com

Ruby: Comment itérer sur une plage, mais par incréments définis?

Donc, je parcourt une plage comme celle-ci:

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

Mais ce que je voudrais faire, c'est itérer par 10.

Donc au lieu d’augmenter n de 1, le prochain n serait en réalité 10, puis 20, 30, etc.

143
Shpigford

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

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

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end
236
Berin Loritsch

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
10
Arup Rakshit
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, l'ordre naturel est utilisé. Sinon, step appelle success pour parcourir les éléments de la 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

......

5
Jahan Zinedine

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

for i in (0..10).step(2) do
    puts i
end
4
justsomeguy