Разрешает ли Котлин методы расширения в лямбдах? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь создать хороший SAM-подобный API для создания экземпляров абстрактных классов, потому что мне не нравятся объектные выражения.Я пытаюсь сделать что-то вроде:

{my lambda code here}.my_extension_function()

Возможно ли это с Kotlin?

1 Ответ

0 голосов
/ 29 декабря 2018

Да, это возможно.Пример кода:

// extension function on lambda with generic parameter
fun <T> ((T) -> Unit).my_extension_function() {
    // ...
}

// extension function on lambda without generic parameter
fun (() -> Unit).my_extension_function() {
    // ...
}

И используйте его, например, так:

// lambda variable with generic parameter
val lambda: (Int) -> Unit = {
    // 'it' contains Int value
    //...
}

// lambda variable without generic parameter
val lambda: () -> Unit = {
    //...
}

lambda.my_extension_function()

// also we can call extension function on lambda without generic parameter like this
{
    //...
}.my_extension_function()

// or with generic parameter
{ i: Int ->
        //...
}.my_extension_function()

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

someFunction();

{
    //...
}.my_extension_function()
...