Выражение case в 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
Было изменено синтаксис между 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
достаточно близко.
Ответ 2
В соответствии с 3-м выпуском PickAxe, это намеренно.
p 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
Ответ 3
Вы можете просто заменить двоеточия полуколониями.
Только что протестировал этот пример:
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
Полукольца работает точно так же, как новая строка в этом контексте, я думаю.
Ответ 4
В ваших путях есть ошибка
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
Ответ 5
Это правильный способ сделать это:
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