Возврат анонимных функций, а не лямбда-функций - PullRequest
0 голосов
/ 23 апреля 2019

Я не могу понять, почему функция wrong недопустима в Kotlin


fun right1() : (String) -> String {
    return {
        when {
            it.isEmpty() -> "Empty"
            else -> it.reversed()
        }
    }
}


fun wrong() : (String) -> String {
    return fun(s: String): String {
        when {
            s.isEmpty() -> "Empty"
            else -> s.reversed()
        }
    }
}

fun right2() : (String) -> String {
    return {
        s: String -> 
        when {
            s.isEmpty() -> "Empty"
            else -> s.reversed()
        }
    }
}

Кажется, что я могу возвращать только лямбда-функции и неанонимные функции.

Извините затривиальный вопрос, я котлин новичок.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Сначала давайте рассмотрим, почему right1 и right2 верны. Поскольку вы возвращаете лямбду, а лямбда возвращает свое последнее выражение, равное when, оно будет работать для right1 и right2.

Теперь давайте посмотрим на wrong. Компилятор выдаст следующую ошибку.

Требуется выражение 'return' в функции с телом блока.

Итак, все, что вам нужно сделать, это добавить оператор return перед when, например:

fun notWrong() : (String) -> String {
    return fun(s: String): String {
        return when {
            s.isEmpty() -> "Empty"
            else -> s.reversed()
        }
    }
}

Но есть и лучший способ! Обратите внимание, что вы можете воспользоваться выводом типа Kotlin следующим образом:

fun notWrong() = { s: String -> // parameter of lambda is a String
    when { // String is inferred as return type of when expression
        s.isEmpty() -> "Empty"
        else -> s.reversed()
    }
}

Это менее избыточно и делает то же самое: возвращает лямбду, которая принимает String в качестве параметра и возвращает String.

Вызов возвращенной лямбды будет работать так:

notWrong()("Hello World")

Первая пара скобок предназначена для вызова notWrong, а вторая - для вызова лямбды.

1 голос
/ 23 апреля 2019

Вы можете вернуть анонимные функции. Просто добавьте оператор return перед when, и он будет работать:

fun wrong() : (String) -> String {
    return fun(s: String): String {
        return when {
            s.isEmpty() -> "Empty"
            else -> s.reversed()
        }
    }
}

И вы можете назвать это примерно так:

wrong()("string")
// or using a variable:
val v = wrong()
v("string")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...