Salir de una function anónima en kotlin

Creé un caso de testing para tratar de representar lo que trato de hacer. No puedo entender cómo "parar" continuar trabajando dentro de una function anónima. En el siguiente ejemplo, me gustaría salir de la sección "manzana" si la respuesta es correcta. El siguiente código no se comstack porque dice return @ apple en lugar de return @ banana, que es la única opción válida, pero la escribí a continuación para tratar de explicar lo que bash lograr y comprender mejor cómo hacer algo como esta.

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() } 

Necesita hacer de doStuff una function en inline : la devolución no local solo se admite para lambdas que están en línea.

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

Luego pasa su caso de testing.

No solo es return@apple ilegal, simplemente el return también es ilegal (porque la devolución no local requiere una línea interna: consulte la respuesta de @hotkey, haga doStuff línea y luego funciona) …

(Tenga en count que tales retornos no locales solo se admiten para expresiones lambda pasadas a funciones en línea.)

Esta sección de la documentation de Kotlin cubre Devoluciones en las tags. Nota: el uso de funciones anónimas en lugar de lambdas le permitiría eliminar las tags si así lo desea (pero solo obtendrá devoluciones locales y deberá modificar su código ligeramente).

  @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) } ...