我已经看过如何重载+和*在Ruby中,所以
my_obj + other调用my_obj.+(other).在Python中,你这样做__add__,并有相应__radd__的重载other + my_obj.在Ruby中是否真的没有相应的右侧加法/乘法,这是否有必要重新定义+每个潜在的类other?
简而言之:说我有一个X属于我定义的新类的对象.编写代码很容易X + 5,但似乎为了处理5 + X我需要重新定义Fixnum.+.这是真的?
不,您不需要重新定义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)
| 归档时间: |
|
| 查看次数: |
422 次 |
| 最近记录: |