2011-06-01 9 views

Respuesta

6

Una declaración if probablemente sería más apropiado para su código, ya que no tiene un rango/valor definitivo, sino más bien sólo un mayor que:

if ARGV.length == 0 
    abort "Error 1" 
elsif ARGV.length > 2 
    abort "Error 2" 
end 
15

Bueno, no funciona porque no es una sintaxis de ruby ​​válida. Sin embargo, usted puede hacer esto:

x = 15 
case x 
    when 0..9 then puts "good" 
    when 10..12 then puts "better" 
    when 13..200 then puts "best" 
    else 
    puts "either great or poor" 
end 
+3

¿Cómo puedo solucionar mi código específico? Gracias. – emurad

+0

La tuya es la única respuesta que tiene sentido para mí, verdaderamente idiomática y elegante. Es lo que he usado también. –

35

No es una sintaxis de ruby ​​válida.

Lo que se necesita es

case 
    when ARGV.length == 0 
    abort "Error 1" 
    when ARGV.length > 2 
    abort "Error 2" 
end 

Cuando se escribe case x, la parte importante que hay que entender es que el rubí toma la x y luego se aplica una comparación con el argumento o expresiones se inserta en la cláusula when.

La línea en la que se dice when x >2 lee al rubí como:

if ARGV.length == > 2 

Cuando se quita un objeto específico de las declaraciones case, se puede aplicar condicionales dentro de los when declaraciones.

+1

Ruby 1.8.7 + irb 0.9.5 reports (irb): 4: error de sintaxis, inesperado '>' con el conjunto de instrucciones original de OP. Mi respuesta incluye un conjunto de instrucciones reescrito. –

+0

Lo probé en un archivo .rb, pero muestra un error de sintaxis. * & ^^% &^IRB. – Zabba

+0

En realidad, lo que es molesto aquí es que no puedo encontrar la documentación definitiva para respaldar mi reclamo; simplemente, * sé * la respuesta. rubyspec.org y ruby-doc.org no están siendo útiles. Las especificaciones de sintaxis de lenguaje que puedo encontrar no parecen cubrir este caso. –

19

Uso 1.0/0.0 para conseguir el infinito, que fija el código de @ Mosch:

case ARGV.length 
    when 0 
    raise "Too few" 
    when 3..(1.0/0.0) 
    raise "Too many" 
end 

Usted no tiene que ser Chuck Norris dividir por un punto cero flotante.

+9

En lugar de '(1.0/0.0)' podemos usar 'Float :: INFINITY', que se agregó en ruby 1.9.3. –

Cuestiones relacionadas