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

我正在尝试使用Kotlin-DSL与TeamCity进行交互

在 TC Kotlin指南的这一部分 ,有一个相当奇怪的部分,它似乎是导致语句在飞行中串联的部分。

它首先定义了这些:

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构造函数进行的对象初始化。 我不可避免地感到尴尬,因为不接受这个(名字的外壳应该已经足够暗示!),但是我正在做这个编辑,让人们知道它不是一个函数。 感谢您的热键指出。

首先请注意, Requirements在其构造函数中接受一个函数。 不知道这个函数的类型是什么,我们假设它是Context.() -> Unit ( 一个带 Context 接收器的函数 ,不接受任何参数并返回Unit )。

现在,我们可以自然地为Requirements类型重载加号运算符 ,以便它返回另一个具有应用这两个操作数函数的函数的实例。

你可以用下面的方法在你自己的代码中做到这一点:

 class Requirements(val check: Context.() -> Unit) operator fun Requirements.plus(other: Requirements) = Requirements { check(); other.check() }