Ruby 我可以实现+;=在我的类中增加一个包含的值?
考虑Ruby 我可以实现+;=在我的类中增加一个包含的值?,ruby,Ruby,考虑 class Container def initialize(value = 0) @value = value end def + (other) return @value + other end def - (other) return @value - other end def * (other) return @value * other end def / (other) return @v
class Container
def initialize(value = 0)
@value = value
end
def + (other)
return @value + other
end
def - (other)
return @value - other
end
def * (other)
return @value * other
end
def / (other)
return @value / other
end
def get
return @value
end
end
我想使用+=
来增加容器中的值,如下所示:
c = Container.new(100)
c += 100
print c.get # Expecting 200
上述操作不起作用,因为100
将覆盖c
我知道我可以使用类似于
attr\u访问器的东西来为值生成一个getter和setter,但是我很好奇我是否可以用一种更漂亮的方式来实现这一点,比如使用+=
不,你不能重载+=
。有关可重载运算符的完整列表,请参见
在Ruby中,x+=y
始终表示x=x+y
。更改给定x
的+=
含义的唯一方法是重写x.class
中的+
。但是,+
具有不同的语义,用户很可能期望+
返回一个新对象。如果让+
返回原始x
,可能会让一些用户感到困惑。如果你让+
返回一个不同的对象,那么x
将指向你例子中的另一个对象,就我理解你的问题而言,你不希望这样 x+=y
只是x=x+y
的语法糖。因此,您只需在类中实现+
,就可以免费获得+=
。因为c+=100
只是c=c+100
的一种糖分,所以您无法避免覆盖c
。但是您可以使用类似的对象覆盖它(而不是像您的问题中那样使用fixnum)
你不就用c.value+=100吗?有什么理由不使用attr_访问器吗?@tigeravatar:这是一个选项,但我只是想知道我是否可以只做c+=100。如果没有,那么当然,我将使用attr_accessor。在考虑+=
之前,请尝试c=c+1
更正,但是在这种情况下+
方法返回的是附加值的结果,而不是实现该方法的实例。这意味着c+=100
将c
更改为完全不同类型的对象,从容器
更改为数字。我猜这不是@Omega想要的。说为什么不可以也没什么坏处。@Borodin:我不知道任何更深层次的解释,也许作者们知道。Ruby语言就是这样设计和实现的。正如其他人所指出的,很简单,a+=b
就是a=a+b
,所以+=
根本不是一个“真正的”操作符。它可能不在可以重载的运算符列表中,但也不在运算符列表中=
不能过载,因为那样的话黑魔法就会统治,但是+
可以。让+
变异对象是一个非常糟糕的主意<代码>+
应返回一个值增加的新对象。你实现它的方式,写d=c+100
会改变c
以及d
。对了,我的错。修改
class Container
def initialize(value = 0)
@value = value
end
def + (other)
Container.new(@value + other)
end
def get
@value
end
end
c = Container.new(100)
c += 100
c.get # => 200