这个红宝石代码:
income = "100"
bills = "52"
puts income - bills
抛出错误:
./to_f.rb:6: undefined method `-' for "100":String (NoMethodError)
Ruby 在对字符串执行数学运算时不会自动将字符串转换为数字吗?
这个红宝石代码:
income = "100"
bills = "52"
puts income - bills
抛出错误:
./to_f.rb:6: undefined method `-' for "100":String (NoMethodError)
Ruby 在对字符串执行数学运算时不会自动将字符串转换为数字吗?
Ruby 是一种动态类型、严格类型(或“强类型”)的语言。Lua 是另一种这样的语言。前者意味着变量可以包含任何类型的值。后者——你遇到的——意味着类型强制不会自动发生。
将这些与动态类型和松散类型的 JavaScript 进行对比。你可以在 JavaScript 中编写var x = [] + false;
,它会尝试做一些有用的事情。再举一个例子,在 JavaScript 中"1" + 1 == "11"
但是"1" - 1 == 0
. Ruby 不会做任何这样的事情。
在您的情况下,您需要:
puts income.to_i - bills.to_i
请注意——因为大多数操作符在 Ruby 中被实现为方法——每个类都可以选择操作符如何处理各种类型的操作数。例如:
class Person
def +( something )
if something.is_a?(Numeric)
self.weight += something
elsif something.is_a?(Time)
self.age += something
else
raise "I don't know how to add a #{something.class} to a Person."
end
end
end
然而,大多数时候核心库并没有试图变得如此聪明。
因为可以使用 + 运算符连接字符串,所以并不总是很清楚是否要附加或求和两个包含数字值的字符串。
如果您有两个包含数字的字符串,请在对它们进行任何数学运算之前将它们转换为适当的值(int 或 float):
income = "100"
bills = "52"
puts income.to_f - bills.to_f