gpt4 book ai didi

kotlin - 在 Kotlin 中使用 Javascript 库

转载 作者:IT老高 更新时间:2023-10-28 13:40:10 26 4
gpt4 key购买 nike

我最后一次使用 Kotlin 是在 2015 年 12 月,当时我使用它来 solve a couple of Project Euler problems.

这次我想试试它与 Javascript 的互操作性。现在我的问题是,我们如何在 Kotlin 中导入/使用现有的 Javascript 库?我见过一些人使用 native 关键字,我只想简单解释一下。

最佳答案

没有 native 关键字了,有 @native 注释。目前,它是有效的解决方案,您可以将它与 Kotlin 编译器的 1.0.x 分支一起使用。但是,我们将弃用此注释以支持 extern 注释,因此请准备好最终为 1.1.x 分支重写您的代码。

当您将 @native 注释放在类或顶级函数上时,会发生两件事:

  1. 其主体未编译为 JavaScript。
  2. 编译器直接引用此类或函数,无需包名和修改。

我认为通过提供 JavaScript 库的示例更容易解释:

function A(x) {
this.x = x;
this.y = 0;
}
A.prototype.foo = function(z) {
return this.x + this.y + z;
}

function min(a, b) {
return a < b ? a : b;
}

以及相应的 Kotlin 声明

@native class A(val x: Int) {
var y: Int = noImpl

fun foo(z: Int): Int = noImpl
}

@native fun min(a: Int, b: Int): Int = noImpl

请注意,noImpl 是一个特殊的占位符,因为非抽象函数需要主体,非抽象属性需要初始化器。顺便说一句,当我们用 extern 替换 @native 时,我们将摆脱这个 noImpl

与 JS 库互操作的另一个方面是通过模块系统包含库。抱歉,我们目前没有任何解决方案(但很快就会发布)。见 proposal .您可以对 node.js/CommonJS 使用以下解决方法:

@native interface ExternalModule {
fun foo(x: Int)
}

@native fun require(name: String): dynamic = noImpl

fun main(args: Array<String>) {
val module: ExternalModule = require("externalModule")
module.foo(123)
}

外部模块是这样声明的

function foo(x) {
return x + 1;
}
module.exports = { foo : foo };

关于kotlin - 在 Kotlin 中使用 Javascript 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39588793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com