Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我可以实现+;=在我的类中增加一个包含的值?_Ruby - Fatal编程技术网

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