我上次使用Kotlin的时间是2015年12月,当时我用它来解决几个Project Euler问题.
这次我想尝试与Javascript的互操作性.现在我的问题是,我们如何在Kotlin中导入/使用现有的Javascript库?我见过一些人使用native关键字,我只是想简单解释一下.
没有native关键字,有@native注释.目前,它是工作解决方案,你可以使用它与Kotlin编译器的1.0.x分支.但是,我们将弃用此注释以支持extern注释,因此请准备最终为1.1.x分支重写代码.
将@native注释放在类或顶级函数上时,会发生两件事:
我认为通过提供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;
}
Run Code Online (Sandbox Code Playgroud)
以及相应的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
Run Code Online (Sandbox Code Playgroud)
注意,这noImpl是一个特殊的占位符,由于非抽象函数需要主体和非抽象属性需要初始化器.顺便说一句,当我们更换@native时extern,我们将摆脱这一点noImpl.
与JS库互操作的另一个方面是通过模块系统包含库.对不起,我们现在没有任何解决方案(但很快就会发布).见提案.您可以对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)
}
Run Code Online (Sandbox Code Playgroud)
其中外部模块的声明方式如下
function foo(x) {
return x + 1;
}
module.exports = { foo : foo };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3170 次 |
| 最近记录: |