我是Gradle / Groovy的新手,并且在嵌套闭包中遇到了变量名称解析的问题。我有一个定义一些属性的自定义任务类,我使用闭包实例化该类型的潜在多个任务。这个闭包定义了一个名为与自定义任务类中的一个属性相同的变量,并且我遇到了一些奇怪的行为,这似乎违背了Groovy语言指南中定义的内容。有人可以回答下面代码中的问题吗?
class Something extends DefaultTask {
def thing = "a"
}
/*
def thing = "b" // produces the error message:
// > Could not find method b() for arguments [build_63hfhkn4xq8gcqdsf98mf9qak$_run_closure1@70805a56] on root project 'gradle-test'.
// ...why?
*/
(1..1).each {
def thing = "c"
task ("someTask${it}", type: Something) {
println resolveStrategy == Closure.DELEGATE_FIRST // prints "true"
println delegate.class // prints "class Something_Decorated"
println thing // prints "c" shouldn't this be "a" since it's using DELEGATE_FIRST?
/*
println owner.thing // produces the error message:
// > Could not find property 'thing' on root project 'gradle-test'
// shouldn't the "owner" of this closure be the enclosing closure?
// in that case shouldn't this resolve to "c"
*/
}
}
修改
出于某种原因,将所有def
更改为String
然后又回到def
后,我无法复制产生该奇怪错误的def thing = "b"
行
答案 0 :(得分:1)
代码打印c
,因为名为thing
的变量是在闭包的词法范围内声明的。这意味着闭包只能使用此变量的值。什么会奏效:
重命名闭包中定义的thing
变量。
通过thing
明确提及delegate
:
println delegate.thing