gpt4 book ai didi

java - Groovy Closure 不检查所有者或委托(delegate)范围

转载 作者:行者123 更新时间:2023-12-01 12:00:28 25 4
gpt4 key购买 nike

我正在编写一个小型的Groovy DSL,它依赖于Groovy Closures。然后,我使用 GroovyShellDelegatingScriptJava 程序运行 DSL

从 Java 调用脚本的代码:

DelScript project = new DelScript ();

CompilerConfiguration cc = new CompilerConfiguration();
cc.setScriptBaseClass("groovy.util.DelegatingScript");
GroovyShell sh = new GroovyShell(Launcher.class.getClassLoader(), new Binding(), cc);

DelegatingScript script = (DelegatingScript) sh.parse(new File(path));
script.setDelegate(project);
script.run();

DelScript 的实例充当脚本内的 this 引用,例如在 DelScript 实例中搜索脚本本身中未找到的任何成员或方法。

我的脚本可以包含以下表达式:

create (name: "test") {
// this code can be used to initialize the
// object that is created here
testProperty = "I'm an example"
}

这段代码的目的是创建一个对象,然后调用闭包,该闭包可用于初始化它。正如我之前所说,create 方法驻留在 DelScript 实例中(这就是我想要的),它看起来像这样:

def create(arguments, configClosure) {
// create new object
def x = new Impl(arguments)

// use configClosure to init it
configClosure.delegate = x
configClosure()
}

虽然我设置了 configClosuredelegate,但我收到一个错误,表明 testProperty 不是其中的一部分DelScript 的。我知道 DelScript 实例是 configClosurethis,因为我在 DelScript 作用域中创建了它,但我认为闭包会按以下顺序检查引用:this -> Owner -> delegate。在我的例子中,它从不检查delegate,但在检查this后立即引发异常。

任何人都可以就我做错的事情提供一些反馈吗?

最佳答案

行后

configClosure.delegate = x

放置

configClosure.resolveStrategy = Closure.DELEGATE_FIRST

关于java - Groovy Closure 不检查所有者或委托(delegate)范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28012523/

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