Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle Kotlin DSL中closureOf和delegateClosureOf的区别是什么_Gradle_Kotlin_Closures_Gradle Kotlin Dsl - Fatal编程技术网

Gradle Kotlin DSL中closureOf和delegateClosureOf的区别是什么

Gradle Kotlin DSL中closureOf和delegateClosureOf的区别是什么,gradle,kotlin,closures,gradle-kotlin-dsl,Gradle,Kotlin,Closures,Gradle Kotlin Dsl,说: 有时可能需要调用从Kotlin代码中获取闭包参数的Groovy方法。例如,一些用Groovy编写的第三方插件需要闭包参数 为了提供一种在保留Kotlin强类型的同时构造闭包的方法,存在两种助手方法: closureOf{} delegateClosureOf{} 这两种方法在不同的情况下都很有用,具体取决于您将闭包实例传递到的方法。 有些插件需要简单的闭包。 在其他情况下,插件需要一个委托闭包。 从源代码看,有时没有一个很好的方法来判断应该使用哪个版本。通常,如果使用closureOf

说:

有时可能需要调用从Kotlin代码中获取闭包参数的Groovy方法。例如,一些用Groovy编写的第三方插件需要闭包参数

为了提供一种在保留Kotlin强类型的同时构造闭包的方法,存在两种助手方法:

  • 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()
  }