Ruby DRbObject和覆盖发送

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

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

现在,打电话

foo.send(msg,dest)

调用DRbObject上的#send而不是Adapter.

最简单的修复方法当然是重命名send方法.
但是,我希望尽可能接近我的文档/底层API.

你怎么看?
我应该重命名send方法,还是有一个整洁的(本地)黑客为此?

解决方法

DRbObject使用#method_missing进行远程消息路由魔术.所以,显然,我们应该从foo undefine #send方法,所以它将委托给#method_missing代替!

foo.singleton_class.class_eval {undef_method:send}

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

AdapterDRbObject < DRbObject
  undef_method :send
end

至于你是否应该这样做,这是辩论.

覆盖/删除#send实际上是“好的”,因为每个人都是supposed知道你应该总是调用#__send__. (事实上​​,如果你看一下DRbObject#method_missing,它会调用#__send__.)

另一方面,#send是Ruby的一个非常核心的概念,可能会混淆代码的未来维护者.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...