我注意到协程的一些函数用actual关键字标记。
从文档:
实际表示多平台项目中特定于平台的实现
正如我从文档中 了解到的,actual关键字用于多平台项目,应该与expect关键字配对使用。
像这样的东西:
常用模块:
package org.jetbrains.foo
expect class Foo(bar: String) {
fun frob()
}
fun main(args: Array<String>) {
Foo("Hello").frob()
}
Run Code Online (Sandbox Code Playgroud)
对应模块:
package org.jetbrains.foo
actual class Foo actual constructor(val bar: String) {
actual fun frob() {
println("Frobbing the $bar")
}
}
Run Code Online (Sandbox Code Playgroud)
那个案子很清楚。
但是在包中kotlinx.coroutines.experimental我注意到有些函数像launch或被withContext标记为actual但是expect包中没有函数。
那么没有actual关键字的目的是什么? expect
虽然其他答案中的源代码有所帮助,但我发现此页面(链接到上面评论中提到的@jim-andreas 页面)更有帮助。
具体来说,这段话:
如果您正在开发需要访问实现所需功能(例如,生成 UUID)的特定于平台的 API 的多平台应用程序,请使用预期声明和实际声明的 Kotlin 机制。
通过这种机制,公共源集定义了预期声明,并且平台源集必须提供与预期声明相对应的实际声明。这适用于大多数 Kotlin 声明,例如函数、类、接口、枚举、属性和注释。
编译器确保
expect公共模块中每个标有该关键字的声明actual在所有平台模块中都具有相应的标有该关键字的声明。IDE 提供的工具可帮助您创建缺失的实际声明。
同样,如需了解更多信息,您可以访问此页面。
| 归档时间: |
|
| 查看次数: |
3834 次 |
| 最近记录: |