Ruby 如何实施1+;红宝石中的1=3

Ruby 如何实施1+;红宝石中的1=3,ruby,Ruby,我觉得下面的解决方案 class Fixnum def +(x) self + x + 1 end end 不应该工作,因为+将被递归调用 使用alias存储原始+,如下所示: class Fixnum alias old_plus + def +(x) old_plus(x).succ end end 另一种方法是创建模块: module PlusOne def +(x) super.succ end end Fixnum.prepen

我觉得下面的解决方案

class Fixnum
  def +(x)
    self + x + 1
  end
end

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

使用
alias
存储原始
+
,如下所示:

class Fixnum
  alias old_plus +
  def +(x)
    old_plus(x).succ
  end
end
另一种方法是创建模块:

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

Fixnum.prepend(PlusOne)

1 + 1 #=> 3

你为什么要这么做?读了这个问题后我笑了。你已经在
对象上定义了一个实例方法:
self.class.instance\u方法(:+).owner=>对象
,所以你需要像这样调用它(例如):
Object.new+3
。这可能不是你想要的,而且显然是行不通的。如果你写的是
1+2
,你就是在使用
Fixnum++
,因为
1.class\35;=>Fixnum
。不管是什么原因,不要走这条路,伙计!还有时间回头了。@SharvyAhmed也许他的潜意识想要一个孩子?@Fredwill好吧,这是一个真正的程序员会做的;)使用old_plus(x)。old_plus(1)也可以。我认为破坏所有
+
功能是不对的,只有
1+1=3
应该受到影响。所以我建议新的
+(x)
应该是
(x==1&&self==1)?3:old_plus(x)
@xlembouras我确信它只是为了好玩,没有人会在实践中使用:)@YuHao在我同事以前的工作场所,有人超载了赋值操作符
=
,并让它执行一些业务逻辑。然后他又做了一个黑客:他加了
a=a其目的是触发此逻辑。不久之后,有人删除了显然毫无意义的
a=a语句。。。繁荣大量的测试突然失败。不用说,花了很长时间才发现原因。@rr-:至少你有过测试。你是个天才。您总是有不同的解决方案!:)自从prepend成为一种东西以来,我一直喜欢它而不是直接重写方法。这样做不仅更容易,而且更清晰,并形成一个继承链,很好地记录了您的修改。(例如,
Fixnum.祖先.first#=>PlusOne
)一个小问题是:
prepend
是私有的。因此,要么执行
Fixnum.send(:prepend,PlusOne)
,要么执行
classfixnum;预先注射普鲁松;end
@Ajedi32
模块include
模块prepend
在Ruby 2.1和更高版本中是公共的。