Kotlin - Ошибка «здесь не разрешен возврат» при попытке вернуться к вмещающей функции из лямбды - PullRequest
0 голосов
/ 22 января 2019

Попытка возврата к закрывающей функции (foo) из лямбды показывает ошибку return is not allowed here.

Что здесь происходит?Я что-то не так делаю?

fun bar( baz: () -> Unit ) {

    // Empty function
}

fun foo() : Unit? {

    return null // this works fine

    bar {

        return null // shows error 'return is not allowed here'
    }
}

РЕДАКТИРОВАТЬ:

Я также пытался:

...

bar {

    return@bar null
}

...

Но это дает ошибку Null can not be a value of a non-null type Unit

Ответы [ 2 ]

0 голосов
/ 22 января 2019

В Котлине есть правило - return всегда возвращается из fun.Можно использовать return@<label/function name> для возврата из функции или лямбды.

Далее идет inline fun.Встроенные функции не являются реальными функциями, они встроены в сайт вызова, таким образом, можно сделать возврат изнутри лямбды, которая является параметром для такой функции (есть много примеров этого в стандартной библиотеке)

Подводя итог:

inline fun bar(a: () -> Unit) { a() }
fun buz() : Int {
  bar { return 42 } /// such return is only possible to inline fun
  return 10
}
val x = buz() /// will be 42
bar { if (something) return@bar }

здесь мы возвращаемся из лямбды, а не из функции.

0 голосов
/ 22 января 2019

return оператор не допускается внутри лямбды. Если вы хотите вернуться с лямбды, вы должны использовать метку.

bar {
    return@bar 
}

Или вы можете использовать inline модификатор для функции bar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...