【问题标题】:Ruby DRbObject and overriding sendRuby DRbObject 和覆盖发送
【发布时间】:2012-09-25 04:25:48
【问题描述】:

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

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

现在,打电话

foo.send(msg, dest)

DRbObject 上调用#send,而不是Adapter

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

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

【问题讨论】:

  • 如果sendDRbObject 函数,你为什么会期望它调用Adapter 函数?
  • 请原谅,无论你做什么,都不要覆盖send 方法。或者,如果你有一个好主意,那就去做吧。但是,如果您不这样做,请满足于定义例如。 send_somethingreceive_something.
  • @oldergod。启动 Adapter 的代码启动了一个 DRb 服务器,因此我的应用程序可以通过将 DRbObject 连接到同一个 uri 来与适配器通信。像这样:segment7.net/projects/ruby/drb/introduction.html
  • @Boris,你可能是对的。但是感觉很难看,编程 INTO 语言与 IN 语言:) 我认为在这种情况下最安全的做法是重命名为“send_message”(或“puts”或“transmit”)
  • @SirLenz0rlot:不,不是puts,请。

标签: ruby overriding send drb


【解决方案1】:

DRbObject#method_missing 的远程消息路由魔术吗?所以,很明显,我们应该 undefine 来自 foo#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 的一个非常核心的概念,可能会使代码的未来维护者感到困惑。

【讨论】:

  • 我会将此答案标记为已接受的答案,因为这可能是我当时正在查看的答案。然而,我选择重命名它,正如鲍里斯建议的那样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2011-06-12
  • 2012-12-14
  • 2020-05-05
  • 2015-11-28
相关资源
最近更新 更多