我正在尝试实现 gradle
kotlin
中的插件这将支持这样的结构
env {
app ("ghc-haskell") {
srcLink { "http://downloads.haskell.org/~ghc/8.0.1/ghc-8.0.1-x86_64-unknown-mingw32.tar.xz" }
downloadPath { project(':').projectDir.absolutePath + "\\applications\\plugin" }
installPath { project(':').projectDir.absolutePath + "\\applications\\plugin" }
}
}
但是我遇到了像
srcLink
这样的内部闭包的问题。 , downloadPath
, installPath
.如何将其调用委托(delegate)给相应的kotlin
类(class)?我的扩展看起来像这样
/**
* Keeps all environments.
*/
open class ApplicationEnvironmentContainerExtension {
val environs = mutableMapOf<String, ApplicationEnvironmentExtension>()
fun app(id: String, closure : ApplicationEnvironmentContainerExtension.() -> String) : ApplicationEnvironmentExtension {
val extension = ApplicationEnvironmentExtension()
extension.installationId = id
environs.put(id, extension)
return extension
}
/**
* Sub extension.
*/
open class ApplicationEnvironmentExtension {
var installationId = ""
var srcLink = ""
var downloadPath = ""
var installPath = ""
fun srcLink(closure: ApplicationEnvironmentExtension.() -> String) {
srcLink = closure()
}
fun downloadPath(closure: ApplicationEnvironmentExtension.() -> String) {
downloadPath = closure()
}
fun installPath(closure: ApplicationEnvironmentExtension.() -> String) {
installPath = closure()
}
override fun toString(): String {
return "ApplicationEnvironmentExtension(" +
"installationId='$installationId', " +
"srcLink='$srcLink', " +
"downloadPath='$downloadPath', " +
"installPath='$installPath')"
}
}
}
当我调用我的
print
显示环境列表的任务,它只显示设置 installationId
- 其他字段为空open class PrintingTask : DefaultTask() {
@TaskAction
fun print() {
val extension = this.project.extensions.getByName("env") as ApplicationEnvironmentContainerExtension
extension.environs.forEach {
println(it.value)
}
}
}
如何委托(delegate)
closure
调用 ApplicationEnvironmentExtension
?
最佳答案
您永远不会调用 closure
app
中的参数功能。我认为 app
的签名功能是错误的。它应该是这样的:
fun app(id: String, closure: ApplicationEnvironmentExtension.() -> Unit)
这使得
this
在关闭时引用 ApplicationEnvironmentExtension
.这使得调用 srcLink
, downloadPath
和 installPath
击中正确的物体。然后通过执行以下操作调用闭包:
val extension = ApplicationEnvironmentExtension()
extension.closure()
这将填充
ApplicationEnvironmentExtension
.我也认为
srcLink
的签名, downloadPath
和 installPath
功能错误。它们应该这样定义: fun srcLink(closure: () -> String)
fun downloadPath(closure: () -> String)
fun installPath(closure: () -> String)
关于gradle - 将嵌套闭包调用委托(delegate)给相应的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41955552/