返回與跳轉(zhuǎn)
Kotlin 有三種結(jié)構(gòu)跳轉(zhuǎn)表達(dá)式:
-- return
-- break 結(jié)束最近的閉合循環(huán)
-- continue 跳到最近的閉合循環(huán)的下一次循環(huán)
上述表達(dá)式都可以作為更大的表達(dá)式的一部分:
vals=person.name ?:return
這些表達(dá)式的類型是Nothing type
在 Kotlin 中表達(dá)式可以添加標(biāo)簽硬霍。標(biāo)簽通過 @ 結(jié)尾來表示,比如:abc@笼裳,fooBar@都是有效的(參看語(yǔ)法)唯卖。使用標(biāo)簽語(yǔ)法只需像這樣:
loop@for(iin1..100){//...}
現(xiàn)在我們可以用標(biāo)簽實(shí)現(xiàn) break 或者 continue 的快速跳轉(zhuǎn):
loop@for(iin1..100) {for(jini..100) {if(...)break@loop}}
break 是跳轉(zhuǎn)標(biāo)簽后面的表達(dá)式,continue 是跳轉(zhuǎn)到循環(huán)的下一次迭代躬柬。
在字面函數(shù)拜轨,局部函數(shù),以及對(duì)象表達(dá)式中允青,函數(shù)可以在 Kotlin 中被包裹橄碾。return 允許我們返回到外層函數(shù)。最重要的例子就是從字面函數(shù)中返回,還記得我們之前的寫法嗎:
funfoo() {ints.forEach {if(it==0)returnprint(it)}}
return 表達(dá)式返回到最近的閉合函數(shù)法牲,比如foo(注意這樣非局部返回僅僅可以在內(nèi)聯(lián)函數(shù)中使用)史汗。如果我們需要從一個(gè)字面函數(shù)返回可以使用標(biāo)簽修飾 return :
funfoo() {ints.forEach lit@ {if(it==0)return@litprint(it)}}
現(xiàn)在它僅僅從字面函數(shù)中返回。經(jīng)常用一種更方便的含蓄的標(biāo)簽:比如用和傳入的 lambda 表達(dá)式名字相同的標(biāo)簽拒垃。
funfoo() {ints.forEach {if(it==0)return@forEachprint(it)}}
另外停撞,我們可以用函數(shù)表達(dá)式替代匿名函數(shù)。在函數(shù)表達(dá)式中使用 return 語(yǔ)句可以從函數(shù)表達(dá)式中返回悼瓮。
funfoo() {ints.forEach(fun(value:Int){if(value==0)returnprint(value)})}
當(dāng)返回一個(gè)值時(shí)戈毒,解析器給了一個(gè)參考,比如(原文When returning a value, the parser gives preference to the qualified return, i.e.):
return@a1
表示 “在標(biāo)簽@a返回1” 而不是返回一個(gè)標(biāo)簽表達(dá)式(@a 1)
命名函數(shù)自動(dòng)定義標(biāo)簽:
foo outer() {foo inner() {return@outer}}