您可以在kotlin中返回@label一些值吗?

时间:2018-09-05 11:27:01

标签: kotlin

我刚刚了解了Kotlin中的标签返回值,并编写了此代码示例,其中我将lambda传递给了with,又有一个lambda传递给了forEach,我试图从{{ 1}}位于with内,由于某种原因,编译器崩溃了,下面是代码:

forEach

在Kotlin是否应该允许这样做?这是编译器错误吗?

1 个答案:

答案 0 :(得分:4)

请注意,如果您只想从with返回,则应该改用return@with

所以您的代码应该看起来像这样:

fun main(args: Array<String>) : Unit {
  val l = listOf(listOf(1,2,3), listOf(4,5,6))
  val t = with(l) {
    get(0).forEach {
      return@with 2
    }
  }
  println(t)
}

是的...然后它将返回2。如果您只想从return@forEach返回,也可以使用forEach ...

如果您确实想使用自己的标签,请确保将其放在花括号前(无空格(另请参见Kotlin coding convention regarding lambda formatting)),例如:

fun main(args: Array<String>) : Unit {
  val l = listOf(listOf(1,2,3), listOf(4,5,6))
  val t = with(l) label@{
    get(0).forEach {
      return@label 2
    }
  }
  println(t)
}

还请注意:如果是forwhile或可以使用continuebreak的任何东西,则实际上将标签放在前面(请参见Kotlin reference # Break and Continue Labels),例如:

lambda@ for (i in 1..3) { 
  break@label
}

最后:尝试尽可能省略自己的标签。在大多数情况下,您实际上并不需要它们……并且可能已经足够重用现有的return @ labels了。还要检查Kotlin coding conventions, e.g. returns in lambda