2017-10-17 6 views
2

Je suis en train de l'interface avec TeamCity à l'aide Kotlin-DSLPouvez-vous concaténer des instructions à l'exécution dans Kotlin?

In this section du guide TC Kotlin il y a une partie à la recherche un peu bizarre où il semble que cela fait des déclarations à devenir concaténés à la volée.

Il a d'abord définit ces:

val linux = Requirements() { 
    contains("os.name", "linux") 
} 

val oracle = Requirements() { 
    equals("db.name", "oracle") 
} 

val java6 = Requirements() { 
    contains("env.JAVA_HOME", "1.6") 
} 

Alors est-ce avec ces définitions:

buildType { 
... 
requirements(linux + oracle + java6) 
... 
} 

Je sais que la section ci-dessus code est équivalent à

buildType { 
... 
    requirements { 
     contains("os.name", "linux") 
     equals("db.name", "oracle") 
     contains("env.JAVA_HOME", "1.6") 
    } 
... 
} 

Je supposons que ma question se résume à quel est le type de retour de la fonction 'Requirements' qui peut être juste c oncaténaté ensemble? Je suppose qu'il est une sorte d'enveloppe de déclaration/fonction et Kotlin vous permet de concaténer ces que vous allez, et la signature de la fonction ressemble à ceci:

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

EDIT: Pour quelqu'un qui est confus En lisant ceci dans le futur, les appels aux exigences sont en fait une initialisation d'objet via le constructeur Requirements. Je me sens inévitablement gêné de ne pas en avoir pris connaissance (le boîtier du nom aurait dû être assez clair!) Mais je fais cette édition pour montrer aux gens que ce n'est pas une fonction. Merci à Hotkey pour le signaler.

Répondre

3

D'abord, notez que Requirements accepte une fonction dans son constructeur. Sans savoir quel est le type de cette fonction, supposons que c'est Context.() -> Unit (a function with receiver de Context, n'acceptant aucun argument et returning Unit).

Maintenant, nous pouvons naturellement overload the plus operator pour le type Requirements, de sorte qu'il renvoie une autre instance Requirements qui a une fonction qui applique les deux fonctions à partir des opérandes.

Vous pouvez le faire dans votre propre code de la manière suivante:

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

operator fun Requirements.plus(other: Requirements) = 
    Requirements { check(); other.check() }