Unit) { -6ren">
gpt4 book ai didi

kotlin - 函数中带有和不带有 'suspend' lambda 的“重载分辨率歧义”

转载 作者:行者123 更新时间:2023-12-03 19:13:37 26 4
gpt4 key购买 nike

看这个例子:

fun f(block: suspend () -> Unit) {
println("with suspend")
}

fun f(block: () -> Unit) {
println("without suspend")
}

fun main() {
f(suspend {
})

// This call cause compilation error:
// Error:(16, 5) Kotlin: Overload resolution ambiguity:
// public fun f(block: () -> Unit): Unit defined in root package in file Main.kt
// public fun f(block: suspend () -> Unit): Unit defined in root package in file Main.kt
//
// f({
// })

// This call cause compilation error:
//
// Error:(25, 5) Kotlin: Overload resolution ambiguity:
// public fun f(block: () -> Unit): Unit defined in root package in file Main.kt
// public fun f(block: suspend () -> Unit): Unit defined in root package in file Main.kt
//
// f {
// }
}

这里声明了两个函数(一个在 lambda 中带有 suspend 关键字,一个没有)。

问题:

1) 如何调用第一个或第二个函数?如您所见,我可以使用 suspend 调用函数但是没有 suspend 就不能调用函数关键词。

2) 可以改写 f(suspend {})trailing lambda (即使用类似 f suspend {} 的东西)?

最佳答案

1) 您可以通过一些变通方法调用第二个函数。例如,

val foo = {}
f(foo)

或者
f({}.also{})

甚至更短:
f({}!!)

将调用带有非挂起参数的函数。在这些情况下,您将 lambda 声明为函数参数的上下文,因此默认情况下它不可挂起。

2) 尾随 lambda 语法不支持显式 suspend修饰符,因此您必须使用括号来声明您的 lambda 是可挂起的。

关于kotlin - 函数中带有和不带有 'suspend' lambda 的“重载分辨率歧义”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60247418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com