is_a?
方法无效;我已经尝试过了,很显然它会检查该值是否来自对象或某些东西。
我尝试过这样的事情:
printf "What is the Regular Price of the book that you are purchasing?"
regular_price=gets.chomp
if regular_price.to_i.to_s == regular_price
print "Thank You #{regular_price}"
break
else
print "Please enter your price as a number"
end
有人可以进一步向我解释.to_i
和.to_s
的作用吗?我只是以为他们将用户输入转换为字符串或数值。我实际上不知道如何检查输入内容,以查看他输入的内容是浮点数,字符串还是小数。
我只是不断收到语法错误。我只想知道如何检查这三个值中的任何一个并进行相应的处理。
答案 0 :(得分:0)
您的问题很多,所以我建议您阅读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,它将字符串转换为Integer。如果字符串的开头没有有效的整数,则它将返回0
。例如:
"12345".to_i #=> 12345
"99 red balloons".to_i #=> 99
"0a".to_i #=> 0
"hello".to_i #=> 0
.to_s
method 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
语句不包含任何块。您可以找到有关break
elsewhere 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。如果无法转换,则会引发异常。例如:
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
并显示错误消息。”
我希望这会有所帮助并回答您的问题。