0
点赞
收藏
分享

微信扫一扫

Kotlin Reference (七) Returns and Jumps


most from ​​reference​​

kotlin有三个结构跳跃表达式

  • return 默认情况下,从最近的封闭函数或​​匿名函数​​返回。
  • break 跳出整个循环
  • continue 跳出本次循环,进行下一次循环

所有这些表达式都可以用作更大表达式的一部分:

val s = person.name ?: return

这些表达式的类型是​​Nothing类型​​

Break and Continue

kotlin中的任何表达式都可以标记一个标签。标签是带有@标志的标识符,例如:abc@,fooBar@是有效的标签(参见​​语法​​)。为了标注表达式,我们只是在前面放上一个标签:

loop@ for (i in 1..100) {
// ...
}

现在,我们可以为braak和continue添加label:

loop@ for (i in 1..100) {
for (j in 1..100) {
if (...) break@loop
}
}

break是跳出整个循环,continue是跳出本次循环,继续下一次循环。

Return

使用函数,局部函数和对象表达式,函数可以嵌套到kotlin中。允许我们从外部函数返回。最重要的作用是从lambda表达式返回,如下:

fun foo() {
ints.forEach {
if (it == 0) return // nonlocal return from inside lambda directly to the caller of foo()
print(it)
}
}

return表达式从最近的封闭函数返回,即foo
(请注意,这种非本地返回仅适用于传递给​​​内联函数​​的lambda表达式),如果要从lambda表达式返回,我们必须对其进行标记并限定返回值:

fun foo() {
ints.forEach lit@ {
if (it == 0) return@lit
print(it)
}
}

现在,它只从lambda表达式返回。通常使用implicits标签更方便,这样的标签与传递lambda的函数具有相同的名称:

fun foo() {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}

或者,我们可以用​​匿名函数​​替换lambda表达式。一个匿名函数的return语句从匿名函数本身返回。

fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return // local return to the caller of the anonymous fun, i.e. the forEach loop
print(value)
})
}

当返回一个值时,解析器会给出返回值,即

return@a 1

表示”返回1标签@”,而不是”返回标记表达式(@a 1)”


举报

相关推荐

0 条评论