我已经看到了如何在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/