2017-10-17 87 views
2

我试图用科特林-DSL您可以在Kotlin的运行时连接语句吗?

的TC科特林引导In this section存在这样的情况好像它会导致报表发生在飞行中串接一个相当奇怪的看着一部分与TeamCity的接口。

它首先定义了这些:

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") 
    } 
... 
} 

所以我假设我的问题归结为什么是“需求”函数的返回类型,它可以是c联合在一起?我的猜测是它是某种形式的声明/函数包装和科特林让您连接这些,当您去,和函数签名看起来是这样的:

fun Requirements(init: (a: String, b: String) -> UnknownTypeA) : UnknownTypeB 

编辑: 对于任何人谁是困惑在将来阅读时,对Requirements的调用实际上是通过Requirements构造函数进行的对象初始化。我不可避免地感到尴尬,因为不接受这个(名字的外壳应该已经足够暗示了!),但是我正在做这个编辑,让人们知道它不是一个函数。谢谢Hotkey指出。

回答

3

首先,请注意Requirements在其构造函数中接受一个函数。不知道该函数的类型是什么,我们假设它是Context.() -> Unita function with receiverContext,不接受参数和returning Unit)。

现在,我们自然可以得到Requirements类型的overload the plus operator,这样它就会返回另一个Requirements实例,该实例具有一个应用这两个操作数的函数的函数。

你可以做的是,在下面的方式你自己的代码:

class Requirements(val check: Context.() -> Unit) 

operator fun Requirements.plus(other: Requirements) = 
    Requirements { check(); other.check() } 
相关问题