Выйти из анонимной функции в котлин

Создал тестовый пример, чтобы попытаться представить, что я пытаюсь сделать. Я не могу понять, как «остановить» выполнение работы внутри анонимной функции. В приведенном ниже примере я хотел бы выйти из раздела «яблоко», если ответ правильный. Код ниже не компилируется, потому что он говорит return @ apple вместо return @ banana, который является единственным допустимым вариантом, но я написал его ниже, чтобы попытаться объяснить, чего я пытаюсь достичь, и лучше понять, как делать что-то вроде это.

class FunctionBreakingTest { @Test fun stopInMiddleOfLambda() { var answer = "wrong" doStuff apple@ { doStuff banana@ { answer = "correct" if (answer == "correct") { return@apple } answer = "wrong" } answer = "wrong" } assertEquals("correct", answer) } private fun doStuff(foo: () -> Unit) = foo.invoke() } 

    Вам нужно сделать doStuff inline функцией: нелокальное возвращение поддерживается только для lambdas, которые встроены.

     private inline fun doStuff(foo: () -> Unit) = foo.invoke() 

    Затем проходит тест.

    Мало того, что return@apple незаконно, просто return также является незаконным (потому что нелокальное возвращение требует вставки – см. Ответ от @hotkey, make doStuff inline, а затем он работает) …

    (Обратите внимание, что такие нелокальные возвращения поддерживаются только для лямбда-выражений, переданных встроенным функциям.)

    В этом разделе Документации Котлин содержится информация о возвратах на этикетках. Примечание: использование анонимных функций вместо lambdas позволит вам удалить метки, если вы захотите (но вы получите только локальные возвращения, и вам нужно немного изменить код).

      @Test fun stopInMiddleOfLambda() { var answer = "wrong" doStuff(fun() { doStuff(fun() { answer = "correct" if (answer == "correct") { return } answer = "wrong" }) if(answer != "wrong") { return } answer = "wrong" }) assertEquals("correct", answer) } ...