2017-10-17 1 views
2

는 나는 문이 비행에 연결된하게됩니다 것처럼 보인다 오히려 이상한 찾고 부분이 코 틀린-DSL TC를 코 틀린 가이드의Kotlin에서 런타임에 명령문을 연결할 수 있습니까?

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

에 해당하는 것을 알고 I 내 질문에 무엇이 내려 지는지 가정 해보자. 단지 'c'일 수있는 '요구 사항'함수의 반환 유형은 무엇인가? 같이 온 카페? 내 생각은 문/함수 래퍼의 일종이고, 코 틀린 당신이 가서 당신이이을 연결 할 수 있으며 함수 서명은 다음과 같습니다 :

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

편집이 : 사람들을위한 사람들이 혼란 향후 이것을 읽을 때, Requirements에 대한 호출은 실제로 Requirements 생성자를 통한 객체 초기화입니다. 나는 필연적으로 이것 (이 이름의 대소 문자는 힌트 였음에 틀림 없어!)을 집어 내지 않으면 서 당혹 스럽다.하지만 사람들에게 그것이 기능이 아니라는 것을 분명히하기 위해 편집하고있다. 그걸 지적 해 주신 Hotkey에 감사드립니다.

답변

3

먼저 Requirements은 해당 생성자에 함수를 허용합니다. 함수의 유형이 무엇인지 알지 못하면 Context.() -> Unit (a 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() } 
관련 문제