kotlin coroutines: possible without standard library?

Ale*_*nov 5 coroutine kotlin kotlin-coroutines

My question is rather theoretical. I am quite new to kotlin (only passed the tutorial, didn't write any real code).

通过阅读语言参考,我发现自己对“暂停”是关键字这一事实感到困惑,但是在关键字列表中找不到“启动”之类的东西。这使我认为存在一些不对称性-“挂起”是编译器功能,而“启动”是库功能。我的理解正确吗?如果是这样-将两者都实现为库功能还是将两者都实现为编译器功能会更好吗?

我一直认为您总是可以使用可用的语言功能编写自己的标准库,但是我仍然看不到这是否真的适用于这种情况。

TL; DR:我可以使用纯Kotlin启动协程,而无需导入任何库(无论多么丑陋)吗?

Ale*_*hin 1

我可以使用纯 kotlin 启动一个协程,而不导入任何库(无论那有多难看)吗?

不。所有协程生成器都位于库内kotlinx.coroutines,因此您至少需要它。现在,从理论上讲,您可以自己重新实现此功能。但也许你不应该。

对于 StackOverflow 的答案来说,如何做到这一点有点太长了,但请尝试从 Java 调用此 Kotlin 类的方法:

class AsyncWorks {
    suspend fun print() {
        println("Hello")
    }
}
Run Code Online (Sandbox Code Playgroud)

您会看到,虽然 Kotlin 方法没有参数,但在 Java 中它需要Continuation<? super Unit>. 这就是suspend关键字的作用。Continuation<T>它作为我们函数的最后一个参数添加。

将两者都实现为库功能或同时实现为编译器功能不是更好吗?

理想情况下,您希望所有内容都成为“库功能”,因为它更容易发展。从语言中删除关键字非常困难。理论上,suspend可以避免使用having 作为关键字。Quasar作为一个框架,使用注释来代替。另一方面,Go 编程语言假设所有函数都是可挂起的。所有这些方法都有其优点和缺点。
Kotlin 决定务实一点,添加suspend关键字,将决定权留给开发人员。如果您对这个主题感兴趣,我强烈推荐 Kotlin 协程的作者 Roman Elizarov 的演讲,其中解释了他们的决定:https://www.youtube.com/watch ?v=Mj5P47F6nJg