Intereting Posts
Kotlin: как использовать несколько Generic в классе? Kotlin Gson Deserializing Использование функции инфикса приемника в лямбда (для DSL) Как вернуться из функции функции Котлина Приложение Kotlin не показывает мой json-массив котлин – царство и посылка Имейте индикатор режима офлайн в Mapbox Запуск тестов из Android Studio IDE не восстанавливает чистый библиотечный модуль Java Kotlin: Как дочерний конструктор может использовать вторичный конструктор своего родителя? Как я могу представить отношение многих к многим с Android Room? Исключение Java / Kotlin для шаблона посетителя с типичным типом возврата присваивать переменную только в том случае, если она равна нулю Как добавить класс kotlin в градиентную задачу JavaCompile Использовать статический метод в Java как метод расширения в Котлине Исключенное исключение при сжатии растрового изображения внутри AsyncTask не останавливает выполнение

Можете ли вы конкатенировать заявления во время выполнения в Котлине?

Я пытаюсь взаимодействовать с TeamCity с помощью Kotlin-DSL

В этом разделе руководства 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 

EDIT: для тех, кто смущен при чтении этого в будущем, вызовы требований на самом деле представляют собой инициализацию объекта через конструктор требований. Я неизбежно чувствую себя смущенным, потому что не собираюсь на это (оболочка названия должна была быть намеком!), Но я делаю это редактирование, чтобы дать понять людям, что это не функция. Спасибо Hotkey за указание на это.

    Во-первых, обратите внимание, что Requirements принимают функцию в свой конструктор. Не зная, каков тип этой функции, предположим, что это Context.() -> Unit ( функция с приемником Context , не принимающая аргументов и возвращающий Unit ).

    Теперь мы можем, естественно, перегрузить оператор «плюс» для типа « Requirements », чтобы он возвращал другой экземпляр Requirements который имеет функцию, которая применяет обе функции из операндов.

    Вы можете сделать это в своем собственном коде следующим образом:

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