Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby DRbObject和重写send_Ruby_Overriding_Send_Drb - Fatal编程技术网

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:不,不是
放置
,请原谅。我会把这个答案标记为接受答案,因为这可能是我当时看到的答案。然而,我选择按照鲍里斯的建议将其重命名