Ниже приведен фрагмент кода, с которым я столкнулся в документации Gradle https://docs.gradle.org/current/userguide/tutorial_using_tasks.html
val hello by tasks.registering {
doLast {
println("Hello Earth")
}
}
hello {
doFirst {
println("Hello Venus")
}
}
В приведенном выше примере привет тип TaskProvider, который предоставляет определение задачи / действие Второй вызов hello - продлить поведение задачи.
Этот делегат использование выглядит немного смущающим для меня. Ниже приведены вопросы, которые меня вызывают:
1) При проверке декомпилированного байт-кода я вижу tasks.registering возвращает RegisteringDomainObjectDelegateProviderWithAction объект, который должен использоваться как делегат и, следовательно, должны предоставить методы getValue () и setValue () для делегата для работы, но, как я видел, методы не предусмотрены. Вместо этого класс RegisteringDomainObjectDelegateProviderWithAction имеет свойство DelegateProvider типа tasks , которое должно обеспечивать делегат . Может ли кто-нибудь помочь мне понять, как здесь происходит делегирование?
2) Второй вызов должен добавить поведение в задачу hello . Поскольку hello является свойством, как мы можем передать ему лямбда / поведение? Чего мне не хватает?
Я уже видел kotlin документацию, которая дает хорошее объяснение делегатов, но не помогает понять вышеупомянутый случай https://kotlinlang.org/docs/reference/delegated-properties.html
Буду признателен за подробное объяснение, поскольку я новичок в Kotlin.