Groovy 关闭不检查所有者或委托范围
Groovy Closure not checking owner or delegate scope
我正在写一个小Groovy DSL
,它依赖于Groovy Closures
。然后,我使用 GroovyShell
和 DelegatingScript
.
从 Java
程序中 运行 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()
}
尽管我设置了 configClosure
的 delegate
,但我得到一个 错误 ,即 testProperty
不是 [=20 的一部分=].我知道 DelScript
实例是 configClosure
的 this
,因为我是在 DelScript
范围内创建它的,但我认为闭包会按顺序检查引用:this -> owner -> delegate
。它从不检查 delegate
在我的情况下,但在检查 this
.
后立即引发异常
任何人都可以就我做错了什么给我一些反馈吗?
行后
configClosure.delegate = x
放
configClosure.resolveStrategy = Closure.DELEGATE_FIRST
我正在写一个小Groovy DSL
,它依赖于Groovy Closures
。然后,我使用 GroovyShell
和 DelegatingScript
.
Java
程序中 运行 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()
}
尽管我设置了 configClosure
的 delegate
,但我得到一个 错误 ,即 testProperty
不是 [=20 的一部分=].我知道 DelScript
实例是 configClosure
的 this
,因为我是在 DelScript
范围内创建它的,但我认为闭包会按顺序检查引用:this -> owner -> delegate
。它从不检查 delegate
在我的情况下,但在检查 this
.
任何人都可以就我做错了什么给我一些反馈吗?
行后
configClosure.delegate = x
放
configClosure.resolveStrategy = Closure.DELEGATE_FIRST