Kotlin 中实际关键字的目的是什么

And*_*lov 18 kotlin

我注意到协程的一些函数用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

zsm*_*b13 9

kotlinx.coroutines 库实际上利用了多平台项目,因为它同时支持 JVM 和 JS 编译目标。

您可以在此处找到通用模块,以及expect您在此处提到的函数的特定声明。

  • 我在此链接中找到了有关在多平台实现中使用 `expect` 和 `actual` 的更多信息:http://kotlinlang.org/docs/reference/multiplatform.html#platform-specific-declarations (2认同)

cod*_*emy 7

虽然其他答案中的源代码有所帮助,但我发现此页面(链接到上面评论中提到的@jim-andreas 页面)更有帮助。

具体来说,这段话:

如果您正在开发需要访问实现所需功能(例如,生成 UUID)的特定于平台的 API 的多平台应用程序,请使用预期声明和实际声明的 Kotlin 机制。

通过这种机制,公共源集定义了预期声明,并且平台源集必须提供与预期声明相对应的实际声明。这适用于大多数 Kotlin 声明,例如函数、类、接口、枚举、属性和注释。

在此输入图像描述

编译器确保expect公共模块中每个标有该关键字的声明actual在所有平台模块中都具有相应的标有该关键字的声明。IDE 提供的工具可帮助您创建缺失的实际声明。

同样,如需了解更多信息,您可以访问此页面