Ruby DRbObject和重写send
我今天遇到了一个有趣的情况(简化): 我有一个Ruby DRbObject和重写send,ruby,overriding,send,drb,Ruby,Overriding,Send,Drb,我今天遇到了一个有趣的情况(简化): 我有一个适配器类型的通信对象,具有#发送和#接收方法。 我的应用程序通过DRb与之通信。 所以在我的应用程序中,我有一个DRbObject,比如foo 现在,打电话 foo.send(msg, dest) 调用DRbObject上的#send,而不是适配器 当然,最简单的修复方法是重命名send方法。 但是,我希望尽可能接近我的文档/底层API 你觉得怎么样? 我应该重新命名send方法,还是有一个简单的(本地)方法来解决这个问题?缺少#方法,这是远程消息
适配器类型的通信对象
,具有#发送
和#接收
方法。
我的应用程序通过DRb与之通信。
所以在我的应用程序中,我有一个DRbObject
,比如foo
现在,打电话
foo.send(msg, dest)
调用DRbObject
上的#send
,而不是适配器
当然,最简单的修复方法是重命名send方法。
但是,我希望尽可能接近我的文档/底层API
你觉得怎么样?
我应该重新命名send
方法,还是有一个简单的(本地)方法来解决这个问题?缺少#方法
,这是远程消息路由的魔法吗。因此,很明显,我们应该从foo
中选择#send
方法,这样它将委托给#method#u missing
foo.singleton_class.class_eval{undef_方法:send}
或者以更面向对象的方式进行:
AdapterDRbObject < DRbObject
undef_method :send
end
适配器对象
至于你是否应该这样做,这有待讨论
实际上,覆盖/删除#send
是“可以的”,因为每个人都知道,您应该始终调用#uuuu send
。(事实上,如果查看DRbObject#method#u missing
,它将调用#u#u send_u
)
另一方面,
#send
是Ruby的一个非常核心的概念,可能会让未来的代码维护者感到困惑。如果send
是DRbObject
的话,为什么你希望适配器调用函数呢?发发发慈悲吧,不管你做什么,都不要覆盖send
方法。或者如果你有一个好主意就去做。但如果你不这样做,就满足于定义,例如发送某物
和接收某物
@oldergod。启动适配器的代码启动一个DRb服务器,这样我的应用程序就可以通过让一个DRbObject连接到同一个uri来和适配器通信。像这样:@Boris,你可能是对的。但这感觉很难看,用一种语言编程与用一种语言编程相比:)我认为在这种情况下最安全的做法是改名为“发送消息”(或“放置”或“传输”任何内容)@SirLenz0rlot:不,不是放置
,请原谅。我会把这个答案标记为接受答案,因为这可能是我当时看到的答案。然而,我选择按照鲍里斯的建议将其重命名