Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 为什么CoroutineScope.launch和Coroutine.async是扩展函数而不是CoroutineScope的成员函数?_Kotlin_Kotlinx.coroutines - Fatal编程技术网

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

Kotlin 为什么CoroutineScope.launch和Coroutine.async是扩展函数而不是CoroutineScope的成员函数?,kotlin,kotlinx.coroutines,Kotlin,Kotlinx.coroutines,标题说明了我的问题 为什么CoroutineScope.launch和Coroutine.async只是CoroutineScope的扩展函数,而不是成员函数 它提供了什么好处 我这样问是因为这个设计背后的原因可能对将来的设计也有帮助 提前感谢。主要是因为使用扩展函数,即使将代码表示为一个类,也可以更轻松地在多个模块中构建代码 CoroutineScope实际上是这种设计模式的一个很好的例子。查看声明接口的CoroutineScope.kt。那里只有基本的功能(plus操作符和cancel())

标题说明了我的问题

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

它提供了什么好处

我这样问是因为这个设计背后的原因可能对将来的设计也有帮助


提前感谢。

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

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

您提到的两个函数在
Builders.common.kt
中定义。如果您查看这个文件的内容,您可以看到有多个私有类,这意味着它们只能在这个文件中使用。这马上告诉您,您不需要这些类来实现在
CoroutineScope.kt
中设计的基本功能,它们只用于
launch{…}
async{…}


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

kotlinx.coroutines使用结构化并发方法来确保所有错误都传播到父coroutine。类似地,父协同路由在默认情况下将等待其所有子协同路由完成

当您执行
启动
异步
时,有一个
作业
对象与每个协同程序关联。在设计中使用扩展函数使其隐式工作更容易,而无需代码编写人员的明确关注

您可以查看更详细的说明:


launch
async
是协同路由构建器,但它们不是唯一的构建器:在集成模块中查找(和)等。显然,它们不能是
CoroutineScope
的成员,那么为什么
launch
async
应该是

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