в котлинской лямбде, как строка принимает лямбду?

В gradle-kotlin-dsl... это правильный код

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

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

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


person innov8    schedule 24.10.2018    source источник
comment
try.kotlinlang.org/#/Kotlin%20Koans/Conventions/ Invoke/Task.kt   -  person JB Nizet    schedule 25.10.2018
comment
kotlinlang.org/docs/reference/operator-overloading.html#invoke   -  person JB Nizet    schedule 25.10.2018


Ответы (1)


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

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

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

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.

person zsmb13    schedule 25.10.2018