2017-10-17 90 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() } 
相關問題