2012-02-16 13 views
19

Este es un código de ejemplo de un libro. Supongo que es para Ruby 1.8.Expresión de caso diferente en Ruby 1.9?

birthyear = 1986 
    generation = case birthyear 
     when 1946...1963: "Baby boomer" 
     when 1964...1976: "Generation X" 
     when 1977...2012: "new generation" 
     else nil 
    end 

    puts generation 

lo corrió en Ruby 1.9, y tiene este mensaje de error:

Untitled 2.rb:12: syntax error, unexpected ':', expecting keyword_then or ',' or ';' or '\n' 
    when 1946...1963: "Baby boomer" 
        ^
Untitled 2.rb:13: syntax error, unexpected keyword_when, expecting $end 
    when 1964...1976: "Generation X" 

¿Cómo debería cambiar esto?

Respuesta

38

Hubo un cambio en la sintaxis entre 1.8.x y 1.9.x es donde el : ahora ya no está permitido:

birthyear = 1986 
generation = case birthyear 
    when 1946...1963 
    "Baby boomer" 
    when 1964...1976 
    "Generation X" 
    when 1977...2012 
    "new generation" 
    else 
    nil 
    end 

puts generation 

Técnicamente : ha estado reemplazando ed por then pero esa es una palabra clave opcional si usa una línea nueva. Es un poco complicado ir y rastrear casos en los que ha utilizado la sintaxis anterior, por lo que con suerte la búsqueda de case es lo suficientemente cerca.

+0

gracias @tadman, lo tengo. –

+7

"Hubo un cambio en la sintaxis entre 1.8.x y 1.9.x donde: ahora no está permitido" - El ':' fue * nunca * permitido. * Nunca * fue parte de la sintaxis oficial de Ruby. Fue * nunca * documentado. Se agregó al analizador de MRI por razones desconocidas y se dejó por temor a que un cambio en el analizador sintético pudiera romper algo, pero Matz * siempre * lo hizo * muy * claro que ':' en 'case' y' if' expresiones es * no * parte de la sintaxis, que * no * debe utilizarse y que * se * eliminará del analizador de MRI en el futuro, lo que Koichi Sasada finalmente hizo en YARV. –

+1

Empecé a usarlos en 1.8.x bastante religiosamente, ya que parecían ser el "estándar", incluso de facto en lugar de oficial. Fue un rudo despertar cuando 1.9.x obtuvo apoyo.Al menos pude hacer una expresión regular de Ruby para arreglar el código roto en ese momento. – tadman

0

Hay un error en su pone

puts generation # not "gemeration" 

también intentar algo como esto:

score = 70 

result = case score 
    when 0..40 then "Fail" 
    when 41..60 then "Pass" 
    when 61..70 then "Pass with Merit" 
    when 71..100 then "Pass with Distinction" 
    else "Invalid Score" 
end 

puts result 
+2

código de sangría con cuatro espacios para el formato correcto, o el uso posterior garrapatas de código en línea. – tadman

11

De acuerdo con la 3ª edición del PickAxe, es intencional.

p 125, Caso expresiones:

"Rubí 1.8 permitía utilizar un carácter de dos puntos en lugar de la palabra clave then Esto ya no es compatible."

ejemplo, con then y no hay saltos de línea:

birthyear = 1986 
generation = case birthyear 
    when 1946...1963 then "Baby boomer" 
    when 1964...1976 then "Generation X" 
    when 1977...2012 then "new generation" 
    else nil 
end 

puts generation 
4

Usted puede simplemente reemplazar los dos puntos con semi -colons.

acabo de probar este ejemplo:

birthyear = 1986 
generation = case birthyear 
    when 1946...1963; "Baby boomer" 
    when 1964...1976; "Generation X" 
    when 1977...2012; "new generation" 
    else nil 
end 

puts generation 

El punto y coma funciona exactamente igual que una nueva línea en este contexto, creo.

-2

Ésta es la manera correcta de hacerlo:

score = 70 
result = case score 
    when 0..40 then "Fail" 
    when 41..60 then "Pass" 
    when 61..70 then "Pass with Merit" 
    when 71..100 then "Pass with Distinction" 
    else "Invalid Score" 
end 
puts result 
Cuestiones relacionadas