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

156

Así que estoy iterando sobre un rango como este:

(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.

Entonces, en lugar de aumentar nen 1, el siguiente nsería en realidad 10, luego 20, 30, etc.

Shpigford
fuente
@DiegoDias pero esto tiene lo mejor y luego ese hilo
Jackson Jegatheesan

Respuestas:

256

Consulte http://ruby-doc.org/core/classes/Range.html#M000695 para obtener la API completa.

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

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end
Berin Loritsch
fuente
12
Esta respuesta me llevó a lo que estaba buscando ... Si tienes dos veces, puedes hacerlo(time1..time2).step(15.minutes) do |time|
amanecer el
12

Puedes usar 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
fuente
6

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

for i in (0..10).step(2) do
    puts i
end
justsomeguy
fuente
10
Lo sentimos, pero la guía de estilo ruby ​​desaconseja el uso de forbucles.
Darth Egregious
@DarthEgregious ¿por qué es eso?
Doug
Es una extensión de la filosofía de que cada cosa es un objeto y cada acción es una llamada al método. Entonces, en lugar de usar un incorporado para hacer un bucle for, debe usar el eachmétodo.
Darth Egregious
5
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, el paso invoca succ para iterar a través de los elementos de rango. El siguiente código usa la clase X, que se define en la documentación a 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

......

Jahan
fuente