Interface JRuby:Java中带Ruby块的命令模式:为什么它能工作?

Interface JRuby:Java中带Ruby块的命令模式:为什么它能工作?,interface,jruby,block,command-pattern,respond-to,Interface,Jruby,Block,Command Pattern,Respond To,我正在学习如何将Java库与Ruby代码集成在一起,下面是一个问题 我有一个用Java实现的命令模式,如下所示: 公共接口命令{ 公共字符串执行(字符串参数); } 公共类指挥官{ 公共字符串运行(命令cmd,字符串参数){ 返回cmd.execute(param)+“[这是由run方法添加的]”; } } 当我将其导入JRuby程序时,我可以实现Ruby类,该类respond\u to?:使用一个参数执行,并将其传递给CommandRunner.new.run。这很有效,这很清楚 但我也可以

我正在学习如何将Java库与Ruby代码集成在一起,下面是一个问题

我有一个用Java实现的命令模式,如下所示:

公共接口命令{
公共字符串执行(字符串参数);
}
公共类指挥官{
公共字符串运行(命令cmd,字符串参数){
返回cmd.execute(param)+“[这是由run方法添加的]”;
}
}
当我将其导入JRuby程序时,我可以实现Ruby类,该类
respond\u to?:使用一个参数执行
,并将其传递给
CommandRunner.new.run
。这很有效,这很清楚

但我也可以这样做:

def put_through_runner(参数和块)
CommandRunner.new.run块,参数
结束
p=通过“方法”do参数将|
Cmd在块中的实现,参数:#{param}
结束
把p

我没有将实现
execute
方法的对象传递给Java
CommandRunner
,而是传递一个不实现该方法的代码块。它可以工作:调用块就像它是
execute
方法的实现一样!这怎么可能?JRuby在将块传递给Java时如何处理它?如果我在Ruby中实现了
CommandRunner
,那么上面的代码就不起作用了。

之所以起作用,是因为有一个名为“闭包转换”(closure conversion)的特性。发生的情况是,您传递的块被转换为一个
Proc
对象,该对象带有一个代理,该代理为对象上调用的任何方法调用块中的代码。

我怀疑有什么东西向您的Proc对象添加了一个
execute
方法。您可以在
put\u-through\u-runner
方法中进行检查。没有添加
execute
方法。第一:没有什么可以做,第二:这是我检查的第一件事——在
put\u through\u runner
方法中,
block
对象不
响应?:执行
。让
响应?
返回
false
并不意味着实际情况就是这样。这取决于
响应的方式?
的实现方式。答案很好!我非常感激。我不知道在哪里可以找到解释,也不知道如何利用这个特性。现在清楚了。顺便说一句:JRuby的特性非常好