Сначала давайте рассмотрим, почему 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
, а вторая - для вызова лямбды.