在Gradle'中混淆财产委托;s Kotlin DSL

在Gradle'中混淆财产委托;s Kotlin DSL,kotlin,gradle,gradle-kotlin-dsl,Kotlin,Gradle,Gradle Kotlin Dsl,下面是我在gradle的文档中看到的代码片段 val hello by tasks.registering { doLast { println("Hello Earth") } } hello { doFirst { println("Hello Venus") } } 在上面的示例中,hello是一种TaskProvider类型,它提供任务定义/操作。对hello的第二个调用是扩展任务的行为 我觉得这个代理的用法有点混乱。以

下面是我在gradle的文档中看到的代码片段

val hello by tasks.registering {
    doLast {
        println("Hello Earth")
    }
}
hello {
    doFirst {
        println("Hello Venus")
    }
}
在上面的示例中,hello是一种TaskProvider类型,它提供任务定义/操作。对hello的第二个调用是扩展任务的行为

我觉得这个代理的用法有点混乱。以下是困扰我的问题:

1) 在检查反编译的字节码时,我看到tasks.registing返回RegisteringDomainObjectDelegateProviderWithAction对象,该对象应用作委托,因此应提供getValue()和setValue()方法以使委托正常工作,但如我所见,未提供方法。相反,类RegisteringDomainObjectDelegateProviderWithAction具有类型为tasks的属性,该属性应提供委托。有谁能帮助我理解授权是如何运作的

2) 第二个调用应该向hello任务添加行为。既然hello是一个属性,我们如何能够将lambda/行为传递给它?我错过了什么

我已经看过kotlin文档,它为学员提供了很好的解释,但无助于理解上述情况

我希望能得到详细的解释,因为我是科特林的新手

  • 关于代表的使用:

    委派通过在注册表项DomainObjectDelegateProviderWithAction上定义的扩展运算符方法
    ProviderDeleteGate

    operator fun RegisteringDomainObjectDelegateProviderWithAction<out TaskContainer, Task>.provideDelegate(
        receiver: Any?,
        property: KProperty<*>
    ) = ExistingDomainObjectDelegate.of(
        delegateProvider.register(property.name, action)
    )
    
    基本上,调用
    hello{/*您的lambda*/}
    被分解为
    hello.invoke{/*您的lambda*/}


  • 对于第二个调用,您可以查找运算符重载。见:
    operator fun <T> NamedDomainObjectProvider<T>.invoke(action: T.() -> Unit) =
        configure(action)