案例表达在Ruby 1.9中有所不同?

这是一本书中的示例代码。 我认为它适用于Ruby 1.8。

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" 

我应该怎么改变这个?

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但如果您使用换行符, then这是一个可选关键字。 要使用旧语法来追踪案例,这有点麻烦,所以希望搜索case足够接近。

根据PickAxe的第3版,它是故意的。

第125页,案例表达:

“Ruby 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 

你可以用半殖民地代替冒号。

刚试过这个例子:

 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 

我认为,在这种情况下,分号与新行完全相同。

你的看跌期权有误

 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 

这是正确的方法:

 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