2012-02-16 14 views
19

To przykładowy kod z książki. Zakładam, że jest to dla Rubiego 1.8.Case expression different 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 

Pobiegłem go na Ruby 1.9 i dostał ten komunikat o błędzie:

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" 

Jak mam to zmienić?

Odpowiedz

38

nastąpiła zmiana w składni między 1.8.x oraz 1.9.x gdzie jest : teraz nie jest już dozwolone: ​​

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 

Technicznie : został zastąpiony ed przez then, ale jest to opcjonalne słowo kluczowe, jeśli używasz znaku nowej linii. To trochę kłopotów, aby pójść i wyśledzić przypadki, w których korzystałeś ze starej składni, więc miejmy nadzieję, że wyszukiwanie numeru case jest wystarczająco bliskie.

+0

dzięki @tadman, mam to. –

+7

"Nastąpiła zmiana w składni między 1.8.x a 1.9.x, gdzie: nie jest już dozwolone" - "': 'było * nigdy * dozwolone. To była * nigdy * część oficjalnej składni Ruby. To było * nigdy * udokumentowane. Został on dodany do parsera MRI z nieznanych powodów i pozostawiono go w obawie, że zmiana w parserze może coś zepsuć, ale Matz * zawsze * uczynił go * bardzo * czystym, że ':' w 'case' i' if' wyrażenia to * nie * część składni, że * nie * musi być używana i że * zostanie * usunięta z parsera MRI w przyszłości, co Koichi Sasada w końcu zrobił w YARV. –

+1

Zacząłem używać ich w wersji 1.8.x dość religijnie, ponieważ wydawało się, że są "standardem", nawet jeśli są raczej faktyczne niż oficjalne. To było niegrzeczne przebudzenie, gdy 1.9.x ściągnął wsparcie.Przynajmniej udało mi się stworzyć regexp w języku Ruby, aby naprawić zepsuty kod w tym czasie. – tadman

0

Jest to błąd w swoim stawia

puts generation # not "gemeration" 

również spróbować czegoś takiego:

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

wcięcie kod z czterech miejsc dla prawidłowego formatowania, lub skorzystać z powrotem kleszcze dla kodu inline. – tadman

11

Zgodnie z trzecią edycją PickAxe jest ona zamierzona.

P 125 w sprawie wyrażenia:

"Ruby 1.8 pozwalał na użycie znaku dwukropka zamiast słowa kluczowego then To już nie jest obsługiwany."

przykład, z then i żadne nowe linie:

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

można po prostu zastąpić dwukropka z naczep -colons.

Wystarczy przetestowany poniższym przykładzie:

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 

Średnik działa dokładnie tak samo jak w nowej linii w tym kontekście myślę.

-2

Jest to poprawny sposób to zrobić:

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