打破kotlin中的匿名函数

时间:2017-08-18 23:20:30

标签: loops return kotlin

创建一个测试用例来尝试表示我正在尝试做的事情。我无法弄清楚如何“停止”继续在匿名函数内工作。在下面的例子中,如果答案是正确的,我想打破“苹果”部分。下面的代码没有编译,因为它表示返回@ 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()
}

2 个答案:

答案 0 :(得分:5)

您需要使Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'. Error:(4) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Colored'. Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'. Error:(4) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Colored'. 成为doStuff函数:non-local return仅支持内联的lambdas。

inline

然后你的测试用例通过了。

答案 1 :(得分:2)

return@apple不仅非法,只是普通return也是非法的(因为非本地返回需要内联 - 请参阅@hotkey的答案,使doStuff内联,然后再作品)...

  

(请注意,仅对传递给内联函数的lambda表达式支持此类非本地返回。)

This section of the Kotlin Documentation涵盖标签处的返回。注意:如果您愿意,使用匿名函数而不是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)
    }
...