打破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
函数:只有内联的lambda表达式才支持非本地返回 。
private inline fun doStuff(foo: () -> Unit) = foo.invoke()
然后你的测试用例通过。
不仅return@apple
非法,只是简单的return
也是非法的(因为非本地返回需要内联 – 看@ hkeykey的答案,使doStuff
内联,然后它的工作)…
(请注意,只有传递给内联函数的lambda表达式才支持这种非本地返回。)
Kotlin文档的这一部分包括标签上的退货。 注意:使用匿名函数而不是lambda表达式可以让你在需要的时候消除标签(但是,你只能获得本地返回,而且你需要稍微修改你的代码)。
@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) } ...