2

我正在学习如何将 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 中实现,上面的代码将无法工作。

4

1 回答 1

3

这样做的原因是一个称为“闭包转换”的功能(请参阅此处的文档)。发生的情况是,您传递的块被转换为Proc具有代理的对象,该代理为在对象上调用的任何方法调用块中的代码。

于 2013-11-06T16:36:58.787 回答