我不太明白这是怎么回事

fun foo() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return // non-local return directly to the caller of foo()
        print(it)
    }
    println("this point is unreachable")
}

fun main() {
    foo()
}

输出为

12个

所以整数12.这是因为对于12,表达式if (it == 3)的计算结果为false.但return号飞机在这里做什么呢?退货的是什么?go 哪里呢?有没有办法写得更冗长?

推荐答案

您的函数foo()返回一个隐式单位,因此当您调用return时,它只是立即从foo()返回隐式单位.

您可以更详细地编写return Unit,也可以使用常规的for循环.这基本上与forEach所内联的代码相同.

fun foo(): Unit {
    for (it in listOf(1, 2, 3, 4, 5)) {
        if (it == 3) return Unit
        print(it)
    }
    println("this point is unreachable")
}

如果您使用return@forEach,无论是否带有隐式单元,它都将从lambda返回,这与在传统for循环中使用continue相同,因为会重复调用forEach lambda,每次循环迭代都调用一次.

如果foo()返回的不是单元,则必须返回该类型才能执行非本地返回:

fun foo(): Boolean {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return false
        print(it)
    }
    println("this point is unreachable")
    return true
}

您只能从非crossinline的内联函数lambdas执行非本地返回.

Kotlin相关问答推荐

如何在Kotlin中模拟www.example.com()?

用浮点数或十进制数给出错误答案的阶乘计算

调用即发即忘方法--哪个作用域?

如果启用了Flyway迁移,则不能具有配置属性';datources.default.架构-生成

如何更改默认推断没有接收者的函数类型?

kotlin短路列表判断吗?

Lets plot Kotlin中的多轴比例

使用事务时未调用 Kafka ConsumerInterceptor onCommit

异常传播如何在 CoroutineScope.async 上工作?

Kotlin 使用迭代索引过滤 lambda 数组

Kotlin 枚举中的循环引用

调用单元测试验证伴随对象方法

Kotlin - mutableMapOf() 会保留我输入的顺序

在 Kotlin 中实现 (/inherit/~extend) 注解

为什么 Kotlin Pair 中的条目不可变?

Kotlin中的测试无法访问受保护(protected)的方法

main函数和常规函数有什么区别?

如何从协程范围返回值

使用 rxbinding 时我应该取消订阅吗?

Dagger 2 androidx fragment不兼容类型