为什么在Kotlin中不可能使用对`suspend`函数的方法引用?

s1m0nw1

我有一个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中实现。对挂起函数进行可调用引用会为您提供实例KSuspendFunctionNN= 0,1,...)。此类型的invoke运算符定义为暂停函数,因此您可以像调用直接调用一样调用此类可调用引用来暂停协程。


基本上,支持此功能需要语言设计的其他部分,而不仅仅是与协程捆绑在一起。

为什么不平凡?因为例如当您引用一个普通函数的可调用引用时String::reversed,您会得到类似的信息KFunction1<String, String>如果您可以对某个suspend函数执行相同的操作,您将期望得到什么?

如果相同KFunctionN<...>,则存在一个明显的问题,那就是您可以将其传递给需要普通函数的地方并调用它,这违反了suspend只能在协程内部调用函数(编译器转换其调用位置)的规则。

因此,应该更具体一些。(我目前仅在推测,没有任何实际的设计尝试的想法)例如,可以是a SuspendKFunctionN<...>,它invoke(...)是一个挂起函数,或者(不太可能)是一种特殊的表示法,仅用于传递函数引用,其中一个suspend (T) -> R预期,但无论如何,这样的功能要求全面的设计是面向未来的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么直接使用泛型值是不可能的,但如果从 Dart 中的方法返回也是可能的

来自分类Javascript

为什么不可能从原型更改构造函数?

来自分类Dev

为什么不可能在特征中定义此构造函数?

来自分类Dev

为什么在C中不可能重载?

来自分类Dev

为什么在Haskell中不可能分割整数?

来自分类Dev

为什么在 VB.NET 中不可能声明一个 NotOverridable 方法?

来自分类Java

为什么在Java中不可能在内部匿名类中引用非最终变量?

来自分类Dev

为什么在Scala中不可能将变量与`to`一起使用?

来自分类Dev

为什么不可能有指向返回引用的指针?

来自分类Dev

不可能使用vue-recaptcha-v3

来自分类Dev

python范围步长不可能使用枚举

来自分类Dev

为什么不可能显式地默认具有volatile参数的副本构造函数?

来自分类Dev

为什么不可能获得指向基类的受保护方法的指针?

来自分类Dev

为什么不可能在Nullable <T>速记上调用静态方法?

来自分类Dev

为什么包含不可能的条件分支会更改此方法的返回值?

来自分类Java

为什么在C#泛型中这是不可能的?

来自分类Dev

如何在部分模板中设置@key?(或者为什么不可能?)

来自分类Dev

为什么不可能从Objective-C目标文件中隐藏符号?

来自分类Dev

为什么要在Typescript中创建不可能的交集类型?

来自分类Dev

为什么在Python中不可能实现真正的不变性?

来自分类Dev

为什么不可能对结论中使用的术语进行归纳?

来自分类Dev

观看未使用的局部变量是不可能的吗?为什么?

来自分类Dev

ABAP中本地接口的相互引用不可能?

来自分类Java

堆转储中不可能的Java内存引用

来自分类Dev

是否不可能使用 HTML 在 Jupyter notebook markdown 中并排放置两个图像?

来自分类Dev

Nullable <int?>是不可能的,为什么不能呢?

来自分类Dev

为什么阶乘1000年不可能的BigInteger?

来自分类Dev

volatile struct = struct不可能,为什么?

来自分类Dev

为什么本文中的这个问题是不可能的?

Related 相关文章

  1. 1

    为什么直接使用泛型值是不可能的,但如果从 Dart 中的方法返回也是可能的

  2. 2

    为什么不可能从原型更改构造函数?

  3. 3

    为什么不可能在特征中定义此构造函数?

  4. 4

    为什么在C中不可能重载?

  5. 5

    为什么在Haskell中不可能分割整数?

  6. 6

    为什么在 VB.NET 中不可能声明一个 NotOverridable 方法?

  7. 7

    为什么在Java中不可能在内部匿名类中引用非最终变量?

  8. 8

    为什么在Scala中不可能将变量与`to`一起使用?

  9. 9

    为什么不可能有指向返回引用的指针?

  10. 10

    不可能使用vue-recaptcha-v3

  11. 11

    python范围步长不可能使用枚举

  12. 12

    为什么不可能显式地默认具有volatile参数的副本构造函数?

  13. 13

    为什么不可能获得指向基类的受保护方法的指针?

  14. 14

    为什么不可能在Nullable <T>速记上调用静态方法?

  15. 15

    为什么包含不可能的条件分支会更改此方法的返回值?

  16. 16

    为什么在C#泛型中这是不可能的?

  17. 17

    如何在部分模板中设置@key?(或者为什么不可能?)

  18. 18

    为什么不可能从Objective-C目标文件中隐藏符号?

  19. 19

    为什么要在Typescript中创建不可能的交集类型?

  20. 20

    为什么在Python中不可能实现真正的不变性?

  21. 21

    为什么不可能对结论中使用的术语进行归纳?

  22. 22

    观看未使用的局部变量是不可能的吗?为什么?

  23. 23

    ABAP中本地接口的相互引用不可能?

  24. 24

    堆转储中不可能的Java内存引用

  25. 25

    是否不可能使用 HTML 在 Jupyter notebook markdown 中并排放置两个图像?

  26. 26

    Nullable <int?>是不可能的,为什么不能呢?

  27. 27

    为什么阶乘1000年不可能的BigInteger?

  28. 28

    volatile struct = struct不可能,为什么?

  29. 29

    为什么本文中的这个问题是不可能的?

热门标签

归档