这个Ruby代码:
income = "100"
bills = "52"
puts income - bills
犯了一个错误:
./to_f.rb:6: undefined method `-' for "100":String (NoMethodError)
Ruby在对它们执行数学运算时不会将字符串自动转换为数字吗?
答案 0 :(得分:14)
Ruby是一种dynamically-typed,strictly-typed(或“强类型”)语言。 Lua是另一种这样的语言。前者意味着变量可以包含任何类别的值。后者 - 你遇到的 - 意味着类型强制不会自动发生。
将这些与JavaScript进行对比,JavaScript是动态类型和松散类型。在JavaScript中,您可以编写var x = [] + false;
,然后尝试做一些有用的事情。另一个例子,在JavaScript "1" + 1 == "11"
但"1" - 1 == 0
。 Ruby不会做任何这样的事情。
在您的情况下,您需要:
puts income.to_i - bills.to_i
请注意 - 因为Ruby中的大多数operators are implemented as methods - 每个类都可以选择操作符如何处理各种类型的操作数。例如:
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
然而,大多数情况下,核心库并不会那么聪明。
答案 1 :(得分:6)
因为字符串可以使用+运算符连接,所以不总是要清楚是否要追加或加总两个包含数字值的字符串。
如果您有两个包含数字的字符串,请在对它们进行任何数学运算之前将它们转换为适当的值(int或float):
income = "100"
bills = "52"
puts income.to_f - bills.to_f