Gradle Kotlin DSL中closureOf和delegateClosureOf的区别是什么
说: 有时可能需要调用从Kotlin代码中获取闭包参数的Groovy方法。例如,一些用Groovy编写的第三方插件需要闭包参数 为了提供一种在保留Kotlin强类型的同时构造闭包的方法,存在两种助手方法:Gradle Kotlin DSL中closureOf和delegateClosureOf的区别是什么,gradle,kotlin,closures,gradle-kotlin-dsl,Gradle,Kotlin,Closures,Gradle Kotlin Dsl,说: 有时可能需要调用从Kotlin代码中获取闭包参数的Groovy方法。例如,一些用Groovy编写的第三方插件需要闭包参数 为了提供一种在保留Kotlin强类型的同时构造闭包的方法,存在两种助手方法: closureOf{} delegateClosureOf{} 这两种方法在不同的情况下都很有用,具体取决于您将闭包实例传递到的方法。 有些插件需要简单的闭包。 在其他情况下,插件需要一个委托闭包。 从源代码看,有时没有一个很好的方法来判断应该使用哪个版本。通常,如果使用closureOf
closureOf{}
delegateClosureOf{}
闭包
实例传递到的方法。
有些插件需要简单的闭包。
在其他情况下,插件需要一个委托闭包。
从源代码看,有时没有一个很好的方法来判断应该使用哪个版本。通常,如果使用closureOf{}
获得NullPointerException
,使用delegateClosureOf{}
将解决问题
好吧,我没有什么要尝试的失败修复方法,但也许有一种确定性的方法可以提前告诉你该使用哪种方法以及为什么
但也许有一种确定性的方法可以提前告诉你该使用哪种方法
当然,只需检查您正在配置的插件的源代码即可。例如,他们的Bintray插件示例为:
bintray {
pkg(closureOf<PackageConfig> {
// Config for the package here
})
}
这是一个简单的closureOf{}
,因此根据文档,这里应该使用closureOf{}
现在,他们的另一个例子是配置农场时的Gretty插件:
farms {
farm("OldCoreWar", delegateClosureOf<FarmExtension> {
// Config for the war here
})
}
这比前面的示例要复杂得多,根据文档,因为这显然需要委托闭包,所以delegateClosureOf{}
将是合适的选择
farms {
farm("OldCoreWar", delegateClosureOf<FarmExtension> {
// Config for the war here
})
}
void farm(String name = null, Closure closure) {
if(name == null)
name = ''
def f = farmsMap_[name]
if(f == null)
f = farmsMap_[name] = createFarm()
closure.delegate = f
closure.resolveStrategy = Closure.DELEGATE_FIRST
closure()
}