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

JD.*_*JD. 6 ruby string floating-point integer

这个Ruby代码:

income = "100"
bills  = "52"

puts income - bills
Run Code Online (Sandbox Code Playgroud)

扔错了:

./to_f.rb:6: undefined method `-' for "100":String (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

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

Phr*_*ogz 14

Ruby是一种动态类型,严格类型(或"强类型")语言.Lua是另一种这样的语言.前者意味着变量可以包含任何类别的值.后者 - 你遇到的 - 意味着类型强制不会自动发生.

将它们与JavaScript进行对比,JavaScript是动态类型和松散类型的.在JavaScript中,您可以编写var x = [] + false;尝试执行有用的操作.再如,在JavaScript中"1" + 1 == "11""1" - 1 == 0.Ruby不会做任何这样的事情.

在您的情况下,您需要:

puts income.to_i - bills.to_i
Run Code Online (Sandbox Code Playgroud)

请注意 - 因为大多数运算符都是作为 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
Run Code Online (Sandbox Code Playgroud)

但是,大多数情况下,核心库并不会那么聪明.


JD.*_*JD. 6

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

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

income = "100"
bills  = "52"

puts income.to_f - bills.to_f
Run Code Online (Sandbox Code Playgroud)