【发布时间】:2019-10-04 13:09:36
【问题描述】:
我的问题是理论上的。 我对 kotlin 很陌生(只通过了教程,没有写任何真正的代码)。
阅读语言参考后,我发现自己对“suspend”是一个关键字这一事实感到困惑,但我在关键字列表中找不到像“launch”这样的东西。这让我觉得有些不对称——“挂起”是一个编译器功能,而“启动”是一个库函数。我的理解正确吗?如果是这样 - 将两者都实现为库功能或同时实现为编译器功能不是更好吗?
我一直认为您可以随时使用可用的语言功能编写自己的标准库,但我仍然看不出这是否真的适用于这种情况。
TL;DR:我可以使用纯 kotlin 启动协程,而无需导入任何库(不管那会多么难看)?
【问题讨论】:
-
您是否尝试过通过
kotlinx.coroutines(我假设您出于某种原因想要替换它?)并查看它是如何完成的? -
是的,我做到了。如果你追踪它,那么你最终会得到类似 SafeContinuation::resumeWith() 的东西(我没有找到它的来源)。然而,这不是我的问题。我的问题是为什么“启动”是库函数而“挂起”是关键字?为什么会出现这种不对称?
-
您可以在官方 kotlin 论坛或协程 github 上询问,以便有更好的机会引起实际做出该决定的人的注意。我的猜测是包含
suspend作为标准关键字只是开发人员团队的一个小“作弊”,否则他们需要求助于奇怪的标记注释。 -
我似乎找到了一些可能相关的实现:coroutineCodegenUtil.kt 包含一个 invokeDoResumeWithUnit() 的实现,它包含几个堆栈交互和一个 invokevirtual()。我的猜测是这些被直接翻译成相应的字节码。如果 kotlin 给了我们直接生成字节码的能力,那么我更加困惑为什么“suspend”不是库函数而是关键字。但是谢谢你的指点,这似乎真的是要走的路。
-
判断不过《Kotlin Coroutines Reloaded》中所说的,编译器支持不限于“suspend”关键字。似乎还有“启动协程”和“暂停协程”功能。 youtube.com/watch?time_continue=2440&v=3xalVUY69Ok
标签: kotlin coroutine kotlin-coroutines