в kotlin лямбде, как строка принимает лямбда? - PullRequest
0 голосов
/ 25 октября 2018

В gradle-kotlin-dsl ... это допустимый код

tasks {
   "build" {
      // inner lambda code here

Как может работать, чтобы строка могла принимать лямбда-параметр, или как работает этот синтаксис?Строка «build» кажется одной из списка строк, которые заменяют вызовы функций?Что-то в применимом определении класса должно настроить это поведение, но я не могу думать, как это сделать.

То, как это работает, может быть техникой, которая имеет другие применения, но для оценки этого необходимо знатькак это работает!

1 Ответ

0 голосов
/ 25 октября 2018

Это сочетание пары возможностей языка Kotlin, которые часто используются для создания DSL , в частности:

  • оператора вызова, который позволяет вам определить () оператор вызова функции для типа, с произвольным списком параметров ( документы )
  • возможность передать последний лямбда-параметр в функцию вне паратезов, которые обычно необходимы для списка параметров ( документы )
  • расширения, позволяющие добавлять новые методы к существующим типам, даже если вы не являетесь их владельцем ( документы )

Чтобы добиться синтаксиса, о котором вы конкретно спрашивали, вы можете написать такой метод:

operator fun String.invoke(block: () -> Unit) {
    // Do whatever you'd like with the String and the lambda
    // you received as a parameter
}

Лямбда, которую вы используете в качестве параметра, также может быть расширением для любого типа, который вы хотите.(возможно, String, но зависит от вашего варианта использования), может принимать параметры или ожидать возврата значения вместо Unit.

Дело в том, что внутри этого расширения у вас будет доступ к String, который был вызван как this, и у вас будет лямбда, переданная ему.


Для дальнейшего ознакомления, вот статья, состоящая из нескольких частей, которая демонстрирует некоторые методы построения DSL.

...