4

我今天遇到了一个有趣的情况(简化):

我有一个类型的通信对象Adapter,带有一个#send和一个#receive方法。我的应用程序通过 DRb 与它通信。所以在我的应用程序中,我有一个DRbObject,可以说foo

现在,打电话

foo.send(msg, dest)

调用#sendon DRbObject,而不是Adapter.

最简单的修复当然是重命名发送方法。但是,我想尽可能靠近我的文档/基础 API。

你怎么看?我应该重命名该send方法,还是对此有一个简洁的(本地)hack?

4

1 回答 1

2

DRbObject使用#method_missing. 所以,很明显,我们应该取消定义#send方法 from所以foo它会委托给#method_missing

foo.singleton_class.class_eval { undef_method :send }

或者以更面向对象的方式进行:

AdapterDRbObject < DRbObject
  undef_method :send
end

至于你是否应该这样做,还有待商榷。

覆盖/删除实际上是“可以的” #send,因为每个人都应该知道你应该总是打电话#__send__。(实际上,如果您查看DRbObject#method_missing,它会调用#__send__。)

另一方面,#send它是 Ruby 的一个非常核心的概念,可能会使未来的代码维护者感到困惑。

于 2013-04-23T12:40:29.310 回答