如何在Ruby中实现1 + 1 = 3

Hua*_*ghe 34 ruby

我感觉下面的解决方案

class Fixnum
  def +(x)
    self + x + 1
  end
end
Run Code Online (Sandbox Code Playgroud)

不应该工作,因为+将递归调用.

Yu *_*Hao 28

使用alias存储原始+像这样的工作:

class Fixnum
  alias old_plus +
  def +(x)
    old_plus(x).succ
  end
end
Run Code Online (Sandbox Code Playgroud)

  • @YuHao在我的同事之前的工作场所,有人重载了赋值运算符`=`并使它做了一些业务逻辑.然后他做了另一个黑客:他添加了"a = a;",其目的是触发这个逻辑.不久之后,有人删除了明显毫无意义的"a = a;"声明......繁荣.测试的重量突然失败了.不用说,发现原因需要很长时间. (20认同)
  • @ rr-:至少你有过测试. (16认同)
  • 使用old_plus(x).old_plus(1)也可以. (5认同)
  • 我不认为打破所有`+'功能是正确的,只有`1 + 1 = 3`才会受到影响.所以我建议新的`+(x)`应该是`(x == 1 && self == 1)?3:old_plus(x)` (3认同)
  • @xlembouras我敢肯定这只是为了好玩,没有人会在实践中使用它:) (2认同)

Ste*_*fan 26

另一种方式是prepend模块:

module PlusOne
  def +(x)
    super.succ
  end
end

Fixnum.prepend(PlusOne)

1 + 1 #=> 3
Run Code Online (Sandbox Code Playgroud)