我已经看到了如何在Ruby中重载+*,以便my_obj + other调用my_obj.+(other).在Python中,您可以使用__add__进行此操作,并且有一个对应的__radd__用于重载other + my_obj。 Ruby中确实没有等效的右侧加法/乘法运算,这是否有必要为+的每个潜在类重新定义other吗?

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

最佳答案

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

编辑:这是使用强制的示例:

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>

关于ruby - ruby 中是否存在正确的加法/乘法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1283977/

10-11 01:36