2012-02-16 50 views
19

這是一本書的示例代碼。我認爲這是針對Ruby 1.8的。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 

我跑它的Ruby 1.9,並得到該錯誤消息:

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" 

我應該如何改變呢?

回答

38

有在1.8.x的和1.9.x的之間的語法變化,其中:是現在不再允許:

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 

技術上:已被替換由then編輯,但這是一個可選的關鍵字,如果你使用換行符。查找使用舊語法的情況時有點麻煩,所以希望搜索case已經足夠接近了。

+0

謝謝@tadman,我明白了。 – 2012-02-16 04:31:40

+7

「1.8.x和1.9.x之間的語法發生了變化,現在不再允許: - 從不允許使用':'。它從未成爲Ruby官方語法的一部分。它從未被記錄。它被添加到MRI的解析器中,原因不明,因爲害怕解析器的改變可能會破壞某些東西,而Matz總是*非常清楚''''case'和'if'中的':'表達式是* not *語法的一部分,它*不能*被使用,並且它將在未來被從MRI分析器中移除,這是Koichi Sasada最終在YARV中完成的。 – 2012-02-16 13:31:37

+1

我開始在1.8.x中非常虔誠地使用它們,因爲它們似乎是「標準」,即使是事實上的而非官方的。當1.9.x獲得支持時,這是一個粗魯的覺醒。至少我能夠製作一個Ruby正則表達式來修復當時破壞的代碼。 – tadman 2012-02-17 01:06:12

0

。在你放了一個錯誤

puts generation # not "gemeration" 

也嘗試這樣的事:

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

有四個空格正確的格式縮進代碼,或者使用回蜱內嵌代碼。 – tadman 2012-02-16 04:30:35

11

根據PickAxe的第3版,這是故意的。

第125頁,CASE表達式:

「紅寶石1.8允許你在的地方then 關鍵字的使用冒號這是不再支持。」

例如,then並沒有換行:

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

你可以只是 -colons更換冒號。

只是測試這個例子:

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 

分號作品完全一樣在這種情況下一個新行,我想。

-2

這是正確的方式來做到這一點:

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