为什么CoroutineScope.launch和Coroutine.async是扩展函数而不是CoroutineScope的成员函数?

Why is CoroutineScope.launch and Coroutine.async are extension functions instead of a member function of CoroutineScope?

标题说明了我的问题。

为什么CoroutineScope.launchCoroutine.async只是CoroutineScope的扩展函数而不是成员函数?

它有什么好处?

我问这个问题是因为这个设计背后的原因也许对未来的设计也有帮助。

提前致谢。

主要是因为使用扩展函数可以更轻松地在多个模块中构建代码,即使它表示为一个 class。

CoroutineScope 实际上是这种设计模式的一个很好的例子。查看声明接口的 CoroutineScope.kt 。那里只有基本功能(plus 运算符和 cancel()

您提到的两个函数在Builders.common.kt中定义。如果你看一下这个文件的内容,你会发现有多个 class 是私有的,这意味着它们只能在这个文件中使用。这会立即告诉您,您不需要这些 classes 来实现 CoroutineScope.kt 中设计的基本功能,它们仅适用于 launch {...}async {...}

因此,如果您有一个具有多种功能的大型 class,将其分解为多个文件(=模块)是有意义的。

kotlinx.coroutines 使用结构并发方法来确保所有错误都传播到父协程。同样,默认情况下,父协程将等待其所有子协程完成。

当您执行 launchasync 时,每个协程都会关联一个 Job 对象。在没有代码编写者明确关注的情况下,为该设计使用扩展函数使其隐式工作更容易

你可以看看更详细的解释:

https://kotlinlang.org/docs/reference/coroutines/basics.html#structured-concurrency

https://medium.com/@elizarov/structured-concurrency-722d765aa952

launchasync 是协同程序构建器,但它们不是唯一的:在集成模块中查找 future (and another future), publish, the RxJava 2 builders 等。显然,它们不能是 CoroutineScope,那么为什么 launchasync 应该是?

此外,作为扩展函数,您知道它们不依赖于任何 CoroutineScope 私有(好吧,它们可以依赖 internal,因为它们在同一个模块中)。