打破kotlin中的匿名函数

创建一个测试用例来表示我正在尝试做什么。 我无法弄清楚如何“停止”继续在匿名函数中工作。 在下面的例子中,如果答案是正确的,我想跳出“苹果”部分。 下面的代码不能编译,因为它说的是返回@苹果而不是返回@香蕉这是唯一有效的选项,但我写下来试图解释我想要达到的目标,并更好地理解如何去做类似这个。

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函数:只有内联的lambdaexpression式才支持非本地返回 。

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

然后你的测试用例通过。

不仅return@apple非法,只是简单的return也是非法的(因为非本地返回需要内联 – 看@ hkeykey的答案,使doStuff内联,然后它的工作)…

(请注意,只有传递给内联函数的lambdaexpression式才支持这种非本地返回。)

Kotlin文档的这一部分包括标签上的退货。 注意:使用匿名函数而不是lambdaexpression式可以让你在需要的时候消除标签(但是,你只能得到本地的回报,而且你需要稍微修改你的代码)。

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