Разные выражения в Ruby 1.9? - PullRequest
20 голосов
/ 16 февраля 2012

Это пример кода из книги.Я предполагаю, что это для 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"

Как мне изменить это?

Ответы [ 5 ]

39 голосов
/ 16 февраля 2012

Произошло изменение в синтаксисе между 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 достаточно близок.

11 голосов
/ 16 февраля 2012

Согласно 3-му изданию PickAxe , оно является преднамеренным.

p 125, выражения Case:

"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
4 голосов
/ 14 мая 2013

Вы можете просто заменить двоеточия на semi -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

Точка с запятой работает точно так же, какНовая линия в этом контексте, я думаю.

0 голосов
/ 05 июля 2014

Это правильный способ сделать это:

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
0 голосов
/ 16 февраля 2012

В ваших путах есть ошибка

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...