Подтвердить что ты не робот

Выражение 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"

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

4b9b3361

Ответ 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