LINUX.ORG.RU

Помогите исправить Ruby-код

 


0

0

Я первый день изучаю Ruby по книге «Путь Ryby» и в первом же примере столкнулся с проблемой. Прошу прощения за подобный вопрос но рыть в интернете мне не просто так-как я не знаю английский. Под кодом суть проблемы.

# encoding: utf-8

print "Введите температуру и шкалу (C или F): "
str = gets
exit if str.nil? or str.empty?
str.chomp!
temp, scale = str.split(" ")

abort "#{temp} недопустимое число." if temp !~ /-?\d+/

temp = temp.to_f case scale
when "C", "c"
  f = 1.8 * temp + 32
when "F", "f"
  c = (5.0 / 9.0) * (temp - 32)
else
  abort "Необходимо задать C или F."
end

if f.nil?
  print "#{c} градусов C.\n"
else
  print "#{f} градусов F.\n"
end

Версия Ruby ruby 1.9.3p0 (2011-10-30 revision 33570)

Запускаю: ruby temp.rb Все работает задает вопрос: Введите температуру и шкалу (C или F):
Если пишу в конце «C» то: temp.rb:13:in `*': String can't be coerced into Float (TypeError) from temp.rb:13:in `<main>'
Если пишу в конце «F» то: temp.rb:15:in `<main>': undefined method `-' for «45»:String (NoMethodError)

Буду рад если мне помогут и объяснят.

Ну у тебя temp и scale выходят из сплита, а значит это строки. Ты их суешь в арифметику, на что и получаешь ошибку. Приведи оба к числам, наверное .to_f(), я рубей не знаю. Английский уже надо знать на уровне google ruby string to number, иначе нет смысла всем этим заниматься.

Upd: вижу to_f, попробуй поставить пару ентеров перед кейсом что-ли.

arturpub ★★
()
Последнее исправление: arturpub (всего исправлений: 1)

1.9.3 в 2014? Но зойчем?
Уже две мажорных версии сменилось, причем со сломом совместимости - пора на 2.1.x переползать.

whoami
()
Ответ на: комментарий от never286

Кейс в таком синтаксе возвращает значение, а интерпретатор может быть не так умен, чтобы отличить его от аргумента to_f, который вычисляется до его вызова, естественно. Я понимаю, что это лишь мое праздное телепатическое предположение, но я за тебя что-ли руби изучать должен? Поставь курсор перед словом case и нажми пару раз enter — возможно разорвешь эту связь, а может дело в другом.

arturpub ★★
()
Ответ на: комментарий от never286

Неа, добро пожаловать в мир внезапного синтакса! Вот почему серьезные проекты пишут на быдломейнстримных языках с убогими однозначными грамматиками;

arturpub ★★
()

temp !~ /-?\d+/ ... .to_f

Можно Float(temp) и ловить исключение.

print «#{c} градусов C.\n»

А не проще: case scale.upcase! ... end; print "#{value} ... #{scale}"?

anonymous
()
Ответ на: комментарий от arturpub

Зато кококо-DSL всяким хипстерам удобно лепить.

Deleted
()
Ответ на: комментарий от anonymous

Проще, но это пример из книги, решил не изощрятся.

never286
() автор топика

Во-первых, напиши по-человечески:

temp = temp.to_f

case scale
  when "C", "c"
    f = 1.8 * temp + 32
  when "F", "f"
    c = (5.0 / 9.0) * (temp - 32)
  else
    abort "Необходимо задать C или F."
end

Во-вторых, температуру вводи «25 C», а не «25C».

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от Novator

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

never286
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.