Это сочетание пары возможностей языка 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.