簡體   English   中英

打破kotlin中的匿名函數

[英]Break out of an anonymous function in 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()
}

您需要使doStuff成為inline函數:僅對內聯的lambda支持非本地返回

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

然后你的測試用例通過。

不僅return@apple非法,只是普通的return也是非法的(因為非本地返回需要內聯 - 請參閱@hotkey的答案,使doStuff內聯然后它工作)...

(請注意,僅對傳遞給內聯函數的lambda表達式支持此類非本地返回。)

Kotlin文檔的這一部分涵蓋了標簽的退貨。 注意:如果需要,使用匿名函數而不是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)
    }
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM