我有一个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:不支持的[可调用的挂起引用]
为什么不起作用?
UPD:这已在Kotlin 1.3.x中实现。对挂起函数进行可调用引用会为您提供实例KSuspendFunctionN
(N
= 0,1,...)。此类型的invoke
运算符定义为暂停函数,因此您可以像调用直接调用一样调用此类可调用引用来暂停协程。
基本上,支持此功能需要语言设计的其他部分,而不仅仅是与协程捆绑在一起。
为什么不平凡?因为例如当您引用一个普通函数的可调用引用时String::reversed
,您会得到类似的信息KFunction1<String, String>
。如果您可以对某个suspend
函数执行相同的操作,您将期望得到什么?
如果相同KFunctionN<...>
,则存在一个明显的问题,那就是您可以将其传递给需要普通函数的地方并调用它,这违反了suspend
只能在协程内部调用函数(编译器转换其调用位置)的规则。
因此,应该更具体一些。(我目前仅在推测,没有任何实际的设计尝试的想法)例如,可以是a SuspendKFunctionN<...>
,它invoke(...)
是一个挂起函数,或者(不太可能)是一种特殊的表示法,仅用于传递函数引用,其中一个suspend (T) -> R
预期,但无论如何,这样的功能要求全面的设计是面向未来的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句