Ruby: ¿Cómo iterar sobre un rango, pero en incrementos establecidos?


Así que estoy iterando sobre un rango así:

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

Pero lo que me gustaría hacer es iterar por 10.

Así que en lugar de aumentar n por 1, el siguiente n sería realmente 10, luego 20, 30, etc etc.

Author: Shpigford, 2010-12-03

4 answers

Véase http://ruby-doc.org/core/classes/Range.html#M000695 para la API completa.

Básicamente se utiliza el método step(). Por ejemplo:

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end
 224
Author: Berin Loritsch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-03 14:15:18

Puede utilizar 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
 7
Author: Arup Rakshit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-24 22:09:09
rng.step(n=1) {| obj | block } => rng

Itera sobre rng, pasando cada enésimo elemento al bloque. Si el rango contiene números o cadenas, se utiliza el orden natural. De lo contrario step invoca succ para iterar a través de elementos de rango. El siguiente código utiliza la clase Xs, que se define en la documentación de nivel de clase.

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

Produce:

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

Referencia: http://ruby-doc.org/core/classes/Range.html

......

 5
Author: Jahan Zinedine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-05 10:31:19

Aquí hay otra forma, quizás más familiar de hacerlo:

for i in (0..10).step(2) do
    puts i
end
 3
Author: justsomeguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-11 20:10:10