gpt4 book ai didi

ruby - ruby 中是否存在正确的加法/乘法?

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:35 26 4
gpt4 key购买 nike

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com