kotlin - 你能在 kotlin 中返回@label 一些值吗?

标签 kotlin

我刚刚了解了 kotlin 中的带标签返回,并编写了这个代码示例,其中我将 lambda 传递给了 with ,还有另一个 lambda 传递给 forEach我试图从 with 返回内forEach ,由于某种原因编译器崩溃,这是代码:

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

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

最佳答案

请注意,如果您只想从 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)
}

另请注意:如果它是 for , while ,或任何地方 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

关于kotlin - 你能在 kotlin 中返回@label 一些值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52184029/

相关文章:

object - 在 Kotlin 中返回不同类型的对象

java - 简单的 RxAndroid 代码不起作用

android - 实际类型别名 'ApplicationContext' 没有对应的预期声明

java - 带有 Kotlin Gradle 和 Git 子模块的多个 buildSrc 文件夹

java - 有没有办法注释 kotlin 对象的 INSTANCE 字段?

generics - Kotlin - 相同的类,不同的内部类

callback - 在 kotlin 中,如何模拟包装回调的挂起函数?

java - 在 Kotlin 中与 @RequestParam 一起使用时,自定义 HashMap 类的参数类型不匹配

kotlin - 在比较中忽略三元组的组成部分

gradle - 如何在Kotlin + gradle项目中实现架构规则?