2011-02-25 26 views
43

¿Puedes hacer esto en ruby? parece a "perder" los casos con las desigualdadescómo usar ruby ​​"case ... when" with inequalities?

case myvar 
when myvar < -5 
    do somethingA 
when -5..-3 
    do special_something_XX 
when -2..-1 
    do special_something_YY 
when myvar == 0 
    do somethingB 
when myvar > 0 
    go somethingC 
end 
+0

Puede utilizar expresiones regulares para atrapar a los diferentes casos vez – Flexo

+0

@Flexo: ¿Su aprobación? ¿Manejar la notación científica? –

Respuesta

86

Usted está mezclando dos tipos diferentes de declaraciones de caso:

case var 
when 1 
    dosomething 
when 2..3 
    doSomethingElse 
end 

case 
when var == 1 
    doSomething 
when var < 12 
    doSomethingElse 
end 
+0

¡Gracias, eso fue útil para mí, un novato relativo! – jpwynn

+9

guau, todo este tiempo no me di cuenta de que existía el segundo tipo. Gracias. –

+0

eli5 escrito por todas partes! Mi tipo de explicaciones favoritas :) – Mark

7

no estoy personalmente convencido de que no sería mejor con sentencias if, pero si quieres una solución en esa forma:

Inf = 1.0/0 

case myvar 
when -Inf..-5 
    do somethingA 
when -5..-3 
    do special_something_XX 
when -2..-1 
    do special_something_YY 
when 0 
    do somethingB 
when 0..Inf 
    do somethingC 
end 

Mi solución preferida sigue. Aquí importa el orden y tienes que repetir el myvar, pero es mucho más difícil dejar de lado los casos, no tienes que repetir cada límite dos veces y el rigor (< frente a <= en lugar de .. frente a ...) es mucho más obvio.

if myvar <= -5 
    # less than -5 
elsif myvar <= -3 
    # between -5 and -3 
elsif myvar <= -1 
    # between -3 and -1 
elsif myvar <= 0 
    # between -1 and 0 
else 
    # larger than 0 
end 
+0

también muy útil gracias! – jpwynn

+0

Personalmente creo que lo que hace que la segunda alternativa sea más clara son los comentarios, no el hecho de que se use if-elsif en lugar de case-when. Dicho esto, también prefiero if-elsif, pero solo porque es más corto. – kikito

24
case myvar 
    when proc { |n| n < -5 } 
     do somethingA 
    when -5..-3 
     do special_something_XX 
    when -2..-1 
     do special_something_YY 
    when proc { |n| n == 0 } 
     do somethingB 
    when proc { |n| n > 0 } 
     go somethingC 
    end 
    end 
+8

Algunas explicaciones y enlaces hubieran sido agradables. –

4
def project_completion(percent) 
case percent 
    when percent..25 
    "danger" 
    when percent..50 
    "warning" 
    when percent..75 
    "info" 
    when percent..100 
    "success" 
    else 
    "info" 
    end 
end 
1

Usando infinity puede ayudar

case var 
when -Float::INFINITY..-1 
when 0 
when 1..2 
when 3..Float::INFINITY 
end 
Cuestiones relacionadas