gpt4 book ai didi

kotlin - 为什么无法在 Kotlin 中使用对 `suspend` 函数的方法引用?

转载 作者:IT老高 更新时间:2023-10-28 13:44:15 24 4
gpt4 key购买 nike

我有一个 Job 实例列表,我想在启动后的某个时间点取消这些实例。如下所示:

val jobs = arrayListOf<Job>()
//launch and add jobs...
jobs.forEach { it.cancelAndJoin() } // cancels the jobs and waits for completion

很遗憾,这里不能使用方法引用。原因:cancelAndJoin 是一个 suspend 函数,编译器提示:

jobs.forEach (Job::cancelAndJoin) 

“错误:(30, 24) Kotlin: Unsupported [Callable references to suspend functions]”

为什么这不起作用?

最佳答案

UPD: 这已在 Kotlin 1.3.x 中实现。获取对挂起函数的可调用引用会为您提供 KSuspendFunctionN 的实例(N = 0, 1, ...)。这种类型有它的invoke运算符定义为挂起函数,因此您可以像直接调用一样调用挂起协程的可调用引用。


基本上,支持这一点需要额外的语言设计部分,而不是简单地与协程捆绑在一起。

为什么它不是微不足道的?因为当您获取普通函数的可调用引用时,例如String::reversed , 你会得到类似 KFunction1<String, String> .如果你可以用 suspend 做同样的事情功能,你希望得到什么?

如果相同KFunctionN<...> , 那么有一个明显的问题是你可以将它传递到一个普通函数所期望的地方并调用它,这违反了 suspend 的规则。函数只能在协程内部调用(编译器会在其中转换它们的调用点)。

所以,它应该更具体一些。 (我目前只是推测,没有任何实际设计尝试的想法)例如,可能是 SuspendKFunctionN<...> , 及其 invoke(...)作为一个挂起函数,或者它可能(不太可能)是一个特殊符号,仅用于传递函数引用,其中 suspend (T) -> R意料之中,但无论如何,这样的功能需要彻底的设计才能适应 future 。

关于kotlin - 为什么无法在 Kotlin 中使用对 `suspend` 函数的方法引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231018/

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