В вашем вопросе много вопросов, поэтому я рекомендую вам прочитать Как мне задать хороший вопрос? , чтобы помочь вам получить ответы в будущем.Я рассмотрю все ваши вопросы и постараюсь дать ответы, которые укажут вам правильное направление.
Метод is_a?
работает, принимая класс в качестве параметра и возвращая логическое значение ,Например:
'foo'.is_a?(String)
=> true
1234.is_a?(Integer)
=> true
'foo'.is_a?(Integer)
=> false
1234.is_a?(String)
=> false
1.234.is_a?(Float)
=> true
Метод .to_i
определен для класса String и преобразует строку в целое число.Если в начале строки нет действительного целого числа, оно вернет 0
.Например:
"12345".to_i #=> 12345
"99 red balloons".to_i #=> 99
"0a".to_i #=> 0
"hello".to_i #=> 0
Метод .to_s
класса Integer
вернет строковое представление целого числа.Например:
1234.to_s
=> '1234'
То же самое относится к Float
:
1.234.to_s
=> '1.234'
Теперь давайте посмотрим на ваш код.Когда я запускаю его, я получаю SyntaxError: (eval):4: Can't escape from eval with break
, что происходит, потому что break
не из чего выйти;он не используется для выхода из оператора if
, а вместо этого используется для выхода из блока.Например:
if true
break
end
вызывает ошибку.Но это не так:
loop do
if true
break
end
end
Причина в том, что при вызове break
говорится "вырваться из окружающего блока", который в данном случае является блоком loop do ... end
.В предыдущем примере не было блока с оператором if
.Вы можете найти более подробное объяснение поведения break
в другом месте в stackoverflow .
Ваш последний вопрос был: «Я просто хочу знать, как проверить любое из 3 значений и обработатьих соответственно. " Этот ответ объясняет, как это сделать, но пример кода написан так, что его трудно расшифровать, поэтому я переписал его ниже в расширенной форме, чтобы прояснить, что происходит:
regular_price = gets.chomp
begin
puts Integer(regular_price)
rescue
begin
puts Float(regular_price)
rescue
puts 'please enter your price as an Integer or Float'
end
end
Этот код сначала пытается преобразовать строку regular_price
в целое число.Это вызывает исключение, если оно не может быть преобразовано.Например:
Integer('1234')
=> 1234
Integer('1.234')
ArgumentError: invalid value for Integer(): "1.234"
Integer('foo')
ArgumentError: invalid value for Integer(): "foo"
Если возбуждено исключение, то строка rescue
останавливает возбуждение исключения и вместо этого продолжает выполнение на следующей строке.В этом случае мы говорим: «Если вы не можете конвертировать в Integer
, тогда rescue
и попробуйте конвертировать в Float
».Это работает так же, как преобразование в Integer
:
Float('1.234')
=> 1.234
Float('foo')
ArgumentError: invalid value for Float(): "foo"
Наконец, мы говорим: «Если вы не можете преобразовать в Float
, тогда rescue
и отображаете сообщение об ошибке».
Надеюсь, это поможет и ответит на ваши вопросы.