2012-02-16 12 views
19

Questo è un codice di esempio di un libro. Presumo che sia per Ruby 1.8.Espressione di caso diversa in 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 

Ho eseguito su Ruby 1.9, ed ha ottenuto questo messaggio di errore:

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" 

Come devo cambiare questo?

risposta

38

C'è stato un cambiamento nella sintassi tra il 1.8.x e 1.9.x dove il : è ora non più permesso:

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 

Tecnicamente : è stato sostituito ed da then ma questa è una parola chiave opzionale se si utilizza una nuova riga. È un po 'complicato andare a rintracciare casi in cui hai usato la vecchia sintassi, quindi spero che la ricerca di case sia abbastanza vicina.

+0

grazie @tadman, ho capito. –

+7

"C'è stata una modifica nella sintassi tra 1.8.xe 1.9.x in cui il comando: non è più consentito" - ":" è stato * mai * permesso. Era * mai * parte della sintassi ufficiale di Ruby. Era * mai * documentato. È stato aggiunto al parser della risonanza magnetica per ragioni sconosciute ed è stato lasciato in sospeso per paura che una modifica al parser possa rompere qualcosa, ma Matz ha * sempre * reso * molto * chiaro che ':' in 'case' e' if' espressioni * non * fa parte della sintassi, che * non deve * essere usato e che * * sarà rimosso dal parser MRI in futuro, cosa che Koichi Sasada ha fatto in YARV. –

+1

Ho iniziato a usarli in 1.8.x in modo abbastanza religioso poiché sembravano essere lo "standard", anche se di fatto piuttosto che ufficiale. È stato un brusco risveglio quando 1.9.x ha tirato il supporto.Almeno sono stato in grado di fare una regexp di Ruby per riparare il codice rotto al momento. – tadman

0

C'è un errore nei vostri mette

puts generation # not "gemeration" 

provare anche qualcosa di simile:

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

codice di rientro con quattro spazi per la formattazione corretta, o utilizzare di nuovo le zecche per codice inline. – tadman

11

Secondo la 3a edizione del PickAxe, è intenzionale.

p 125, espressioni case:

"Ruby 1.8 permesso di utilizzare un carattere due punti al posto della parola chiave then Questo non è più supportato."

esempio, con then e senza ritorni a capo:

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

si può semplicemente sostituire i due punti con semi -colons.

appena testato questo esempio:

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 

Il punto e virgola funziona esattamente lo stesso di una nuova linea, in questo contesto, credo.

-2

Questo è il modo corretto per farlo:

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