【发布时间】:2020-04-17 17:39:29
【问题描述】:
下面是我在 gradle 的文档中遇到的代码 sn-p https://docs.gradle.org/current/userguide/tutorial_using_tasks.html
val hello by tasks.registering {
doLast {
println("Hello Earth")
}
}
hello {
doFirst {
println("Hello Venus")
}
}
在上面,hello 是一个提供任务定义/动作的TaskProvider 类型。对 hello 的第二个调用是扩展任务的行为。
这个 delegate 用法让我有点困惑。以下是困扰我的问题:
1) 在检查反编译的字节码时,我看到 tasks.registering 返回应该用作委托的 RegisteringDomainObjectDelegateProviderWithAction 对象,因此应该提供 getValue() 和delegate 的 setValue() 方法可以工作,但正如我所见,没有提供方法。相反,类 RegisteringDomainObjectDelegateProviderWithAction 有一个 tasks 类型的 delegateProvider 属性,它应该提供 delegate。谁能帮我理解一下,这里的委托是如何工作的?
2) 第二次调用应该为 hello 任务添加行为。由于 hello 是一个属性,我们如何能够将 lambda/行为传递给它?我错过了什么?
我已经看过 kotlin 文档,它很好地解释了代表,但无助于理解上述案例 https://kotlinlang.org/docs/reference/delegated-properties.html
由于我是 Kotlin 的新手,因此希望得到详细的解释。
【问题讨论】:
-
对于第二次调用,您可以查找运算符重载。见:
operator fun invoke()
标签: kotlin gradle gradle-kotlin-dsl