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和更高版本中是公共的。