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)