你能在Kotlin的运行时连接语句吗?

时间:2017-10-17 17:01:03

标签: kotlin teamcity

我正在尝试使用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指出这一点。

1 个答案:

答案 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}}