您的问题有很多,因此我建议您阅读How do I ask a good question? 以帮助您在将来获得答案。我会仔细分析您的每一个问题,并尝试提供答案,为您指明正确的方向。
is_a? 方法works by accepting a class as a parameter and returning boolean。例如:
'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 方法是defined on the String class 并将字符串转换为整数。如果字符串开头没有有效整数,则返回0。例如:
"12345".to_i #=> 12345
"99 red balloons".to_i #=> 99
"0a".to_i #=> 0
"hello".to_i #=> 0
.to_smethod on the Integer class 将返回整数的字符串表示形式。例如:
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 语句的块。你可以找到breakelsewhere on stackoverflow的行为更详细的解释。
您的最后一个问题是“我只想知道如何检查 3 个值中的任何一个并相应地处理它们。” This answer 解释了如何做到这一点,但代码示例的编写方式难以解读,因此我在下面以扩展形式重写了它,以明确发生了什么:
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 并显示错误消息。”
我希望这有助于并回答您的问题。