2010-06-12 18 views
11

ACTUALIZACIÓN 2: Para la posteridad, así es como me he decidido por hacerlo (gracias a la entrada de Jorg):Declarar un rango de números enteros con el paso = 1 en Ruby

100.step(2, -2) do |x| 
    # my code 
end 

(Es obvio que hay un montón de maneras de hacer esto, pero parece que esta es la manera más "Ruby" para hacerlo, y eso es exactamente lo que buscaba)


ACTUALIZACIÓN:. OK, así que lo que estaba buscando para era step:

(2..100).step(2) do |x| 
    # my code 
end 

Pero resulta que no fui 100% cercano en mi pregunta original. De hecho, quiero iterar sobre este rango hacia atrás. Para mi sorpresa, un paso negativo no es legal.

(100..2).step(-2) do |x| 
    # ArgumentError: step can't be negative 
end 

Así: ¿cómo hago esto al revés?


Hey chicos, estoy completamente nuevo a Ruby, así que se gentil.

Digamos que quiero iterar sobre el rango de números pares de 2 a 100; ¿Como podría hacerlo?

Obviamente podría hacer:

(2..100).each do |x| 
    if x % 2 == 0 
     # my code 
    end 
end 

Pero, obviamente, (de nuevo), eso sería muy estúpido.

Sé que podría hacer algo como: (?)

i = 2 
while i <= 100 
    # my code 
    i += 2 
end 

Creo que también podría escribir mi propia clase personalizada que proporciona su propio each método. Estoy casi seguro de que sería excesivo, sin embargo.

Estoy interesado en dos cosas:

  1. ¿Es posible hacer esto con una cierta variación de la sintaxis gama estándar (es decir, (x..y).each)?
  2. De cualquier manera, ¿cuál sería la "forma Ruby" más idiomática de lograr esto (usando un Rango o de otro modo)? Como dije, soy nuevo en el lenguaje; así que cualquier orientación que pueda ofrecer sobre cómo hacer las cosas en un estilo Ruby más típico sería muy apreciada.

Respuesta

19

no se puede declarar un Range con un "paso". Los rangos no tienen pasos, simplemente tienen un principio y un final.

que sin duda puede iterate durante un Range en pasos, por ejemplo como este:

(2..100).step(2).reverse_each(&method(:p)) 

Pero si lo que quieres es para repetir, entonces, ¿qué es lo que necesita el Range en el primer lugar? ¿Por qué no solo iterar?

100.step(2, -2, &method(:p)) 

Esto tiene la ventaja añadida de que a diferencia de reverse_each que no necesita para generar una matriz intermedia.

+0

Agradable. Exactamente lo que necesitaba, y gracias también por aclarar mi terminología. Despejado mucho! –

+0

@ Jörg ¿Alguna idea de cómo terminaste con la última declaración? Los documentos para el paso solo mencionan un argumento, así que me preguntaba cómo trabajaste para llegar a esa forma concisa de resolver este problema. –

+0

@n_x_l: no estoy seguro de qué documentos está viendo, el parámetro 'step' está [claramente documentado] (http://Ruby-Doc.Org/core-2.1.1/Numeric.html#method-i -paso). Los documentos más antiguos que pude encontrar fueron los de Ruby 1.8.6 y [ya estaba allí] (http://Ruby-Doc.Org/core-1.8.6/Numeric.html#method-i-step) en aquel entonces en 2007. –

3

Esta pregunta responde a la suya: about ruby range?

(2..100).step(2) do |x| 
    # your code 
end 
+0

Eso simple, ¿eh? ¡Gracias! –

+0

Entonces, ¿cómo lo haría al revés? –

1

tuve problema similar aquí son las diversas maneras que he encontrado para hacer lo mismo SIMPLE Solía ​​paso en el final porque permitió incrementos negativos y fraccionada, y yo no tenía condiciones, con excepción de los límites de buscar

case loop_type 

    when FOR 
     # doen't appear to have a negative or larger than 1 step size! 
     for kg in 50..120 do 
     kg_to_stones_lbs(kg) 
     end 

    when STEP 
     120.step(70,-0.5){ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when UPTO 
     50.upto(120) { |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when DOWNTO 
     120.downto(50){ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when RANGE 
     (50..120).reverse_each{ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when WHILE 
     kg = 120 
     while kg >= 50 
     kg_to_stones_lbs(kg) 
     kg -= 0.5 
     end 
    end 

O/P:

92.0kg - 7 libras 14st

91.5kg - 6lbs 14st

91.0kg - 5kg 14st

90.5kg - 4 libras 14st

90.0kg - 2kg 14st

89.5kg - 1kg 14st

89.0kg - 0kg 14st

88.5kg - 13 libras 13st

88,0 kg - 13st 12lbs

Cuestiones relacionadas