我正在学习如何将 Java 库与 Ruby 代码集成并提出以下问题。
我有一个用 Java 实现的命令模式,如下所示:
public interface Command {
public String execute(String param);
}
public class CommandRunner {
public String run(Command cmd, String param) {
return cmd.execute(param)+" [this is added by run method]";
}
}
当我将它导入 JRuby 程序时,我可以respond_to? :execute
使用一个参数实现 Ruby 类并将其传递给CommandRunner.new.run
. 这很有效,而且很清楚。
但我也可以这样做:
def put_through_runner(param, &block)
CommandRunner.new.run block, param
end
p = put_through_runner "through method" do |param|
"Cmd implementation in block, param: #{param}"
end
puts p
我没有向 Java 传递CommandRunner
一个实现该execute
方法的对象,而是将一个代码块传递给它,它没有实现该方法。它有效:调用块,就好像它是execute
方法的实现一样!这怎么可能?将块传递给 Java 时,JRuby 对块做了什么?如果我CommandRunner
在 Ruby 中实现,上面的代码将无法工作。