我正在尝试使用Kotlin-DSL与TeamCity进行交互
TC Kotlin指南的In this section有一个相当古怪的部分,似乎它会导致语句在运行中连接起来。它首先定义了这些:
val linux = Requirements() {
contains("os.name", "linux")
}
val oracle = Requirements() {
equals("db.name", "oracle")
}
val java6 = Requirements() {
contains("env.JAVA_HOME", "1.6")
}
然后用这些定义做到这一点:
buildType {
...
requirements(linux + oracle + java6)
...
}
我知道上面的代码部分等同于
buildType {
...
requirements {
contains("os.name", "linux")
equals("db.name", "oracle")
contains("env.JAVA_HOME", "1.6")
}
...
}
所以我想我的问题归结为什么是'要求'的回报类型。可以连接在一起的功能?我的猜测是它是某种语句/函数包装器,Kotlin允许你在你去的时候连接它们,函数签名看起来像这样:
fun Requirements(init: (a: String, b: String) -> UnknownTypeA) : UnknownTypeB
修改 对于任何在将来阅读时感到困惑的人来说,对Requirements的调用实际上是通过Requirements构造函数初始化的对象。我不可避免地因为没有接受这个而感到尴尬(名称的外壳应该足够暗示了!)但是我正在进行编辑以使人们清楚它不是一个功能。感谢Hotkey指出这一点。
答案 0 :(得分:3)
首先,请注意Requirements
在其构造函数中接受一个函数。在不知道该函数的类型的情况下,让我们假设Context.() -> Unit
Context
Requirements
,不接受任何参数和a function with receiver)。
现在,对于Requirements
类型,我们自然可以returning Unit
,这样它就会返回另一个class Requirements(val check: Context.() -> Unit)
operator fun Requirements.plus(other: Requirements) =
Requirements { check(); other.check() }
实例,该实例具有一个从操作数应用这两个函数的函数。
您可以通过以下方式在自己的代码中执行此操作:
{{1}}