7

这个红宝石代码:

income = "100"
bills  = "52"

puts income - bills

抛出错误:

./to_f.rb:6: undefined method `-' for "100":String (NoMethodError)

Ruby 在对字符串执行数学运算时不会自动将字符串转换为数字吗?

4

2 回答 2

15

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

然而,大多数时候核心库并没有试图变得如此聪明。

于 2012-09-26T14:42:42.483 回答
6

因为可以使用 + 运算符连接字符串,所以并不总是很清楚是否要附加或求和两个包含数字值的字符串。

如果您有两个包含数字的字符串,请在对它们进行任何数学运算之前将它们转换为适当的值(int 或 float):

income = "100"
bills  = "52"

puts income.to_f - bills.to_f
于 2012-09-26T14:30:08.383 回答