红宝石中正确的加法/乘法的存在?

Pet*_*ter 5 ruby

我已经看过如何重载+*在Ruby中,所以 my_obj + other调用my_obj.+(other).在Python中,你这样做__add__,并有相应__radd__的重载other + my_obj.在Ruby中是否真的没有相应的右侧加法/乘法,这是否有必要重新定义+每个潜在的类other

简而言之:说我有一个X属于我定义的新类的对象.编写代码很容易X + 5,但似乎为了处理5 + X我需要重新定义Fixnum.+.这是真的?

sep*_*p2k 6

不,您不需要重新定义Fixnum#+(或ruby的数字类的任何其他算术方法).coerce如果两个操作数不是同一个类,则将调用数值类的算术方法.因此,如果您为类定义了一个强制方法,那么在5 + instance_of_your_class没有对Fixnum#+进行任何更改的情况下工作正常.

编辑:以下是使用强制的示例:

class MyNum
  attr_accessor :num

  def initialize(num)
    @num = num
  end

  def +(o)
    lhs, rhs = coerce(o)
    MyNum.new(lhs.num + rhs.num)
  end

  def coerce(o)
    if o.is_a? MyNum
      [self, o]
    else
      [self, MyNum.new(o)]
    end
  end
end

MyNum.new(5)+3 #=> #<MyNum:0x87fca08 @num=8>
3+MyNum.new(5) #=> #<MyNum:0x8807980 @num=8>
Run Code Online (Sandbox Code Playgroud)