未定义的方法` - '表示“100”:字符串

时间:2012-09-26 14:30:08

标签: ruby string floating-point integer

这个Ruby代码:

income = "100"
bills  = "52"

puts income - bills

犯了一个错误:

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

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

2 个答案:

答案 0 :(得分:14)

Ruby是一种dynamically-typedstrictly-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