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

And*_*ind 20 ruby

这是一本书中的示例代码.我认为它适用于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
Run Code Online (Sandbox Code Playgroud)

我在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"
Run Code Online (Sandbox Code Playgroud)

我应该怎么改变这个?

tad*_*man 39

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
Run Code Online (Sandbox Code Playgroud)

技术上:已被替换为then但如果您使用换行符,那么这是一个可选关键字.去跟踪你使用旧语法的情况有点麻烦,所以希望搜索case足够接近.

  • "1.8.x和1.9.x之间的语法发生了变化,其中:现在不再允许了" - ```*永远不允许*.它从来都不是Ruby官方语法的一部分.它从来没有*记录过.它被添加到MRI的解析器中,原因不明,因为担心解析器的改变可能会破坏某些东西,但是Matz总是***非常*清楚`````case`和`if`表达式*不是*语法的一部分,它*不得被*使用,并且它将*将来从MRI解析器中移除,Koichi Sasada最终在YARV中做到了. (7认同)
  • 我开始在 1.8.x 中非常虔诚地使用它们,因为它们似乎是“标准”,即使是事实上的而不是官方的。当 1.9.x 取消支持时,这是一个粗鲁的觉醒。至少我当时能够制作一个 Ruby 正则表达式来修复损坏的代码。 (3认同)

win*_*ons 11

根据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
Run Code Online (Sandbox Code Playgroud)