type: doc layout: reference category: "Syntax"

title: "Returns and Jumps"

返回和跳转

Kotlin 有三种跳出结构

  • return{: .keyword }.默认情况下,从最近的一个封闭的方法或者 方法表达式跳出.

  • break{: .keyword }.终止最近的封闭循环

  • continue{: .keyword }.直接进入循环体的下次循环

中断和继续标签

在Kotlin中任何表达式都可以用label{: .keyword } (标签)来标记。
label的格式是被'@'标识符标记,例如:abc@, fooBar@都是有效的label(参见语法

你可以在一个方法前面放一个label。

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

现在,我们可以将label与 break{: .keyword } 或者continue{: .keyword }一起使用:

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

break执行后将跳转到标记处。

continue{: .keyword }将进入循环体的下次循环

返回标签

在Kotlin里,函数字面量、局部函数和对象表达式等函数都可以被嵌套在一起 适当的返回方式允许我们从外部方法返回值

带标签的return,最重要的一个用途,就是让我们可以从函数字面量中返回。

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

这个 return{: .keyword }表达式从最近的封闭的方法中返回,例如‘foo’。

(注意,非全局的返回只支持内部方法,参见内联方法.) 如果我们只是需要跳出内部方法,我们必须标记它并且返回这个标签

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

现在只是从内部方法返回。有时候用匿名的标签将会更加方便 像这样和方法同名的标签是可以的

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

通常,我们用一个方法表达式替代内部匿名方法。在方法内部声明一个return{: .keyword }将从其内部返回

fun foo() {
  ints.forEach(fun(value: Int) {
    if (value == 0) return
    print(value)
  })
}

当要返回一个值得时候,推荐使用描述性的返回,例如:

return@a 1

意思是“返回被标记为‘@a’值是‘1’的标签,而不是像‘(@a 1)’的一个标签表达式”

被命名的方法自动被定义成为标签

fun outer() {
  fun inner() {
    return@outer // the label @outer was defined automatically
  }
}

翻译BY S_arige