gpt4 book ai didi

interface - JRuby:Java 中带有 Ruby block 的命令模式:为什么会起作用?

转载 作者:行者123 更新时间:2023-12-04 04:35:39 27 4
gpt4 key购买 nike

我正在学习如何将 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 的对象方法 我将一段代码传递给它,它没有实现该方法。它有效:调用 block ,就好像它是 execute 的实现一样。方法!这怎么可能?将 block 传递给 Java 时,JRuby 对 block 做了什么?如果我有 CommandRunner在 Ruby 中实现上述代码将不起作用。

最佳答案

这个工作的原因是一个称为“闭包转换”(see docs here)的功能。发生的情况是您传递的 block 被转换为 Proc具有代理的对象,该代理为在对象上调用的任何方法调用 block 中的代码。

关于interface - JRuby:Java 中带有 Ruby block 的命令模式:为什么会起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19784029/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com