Rust Wasm Bindgen返回对象但得到一个数字

如何解决Rust Wasm Bindgen返回对象但得到一个数字

今天,在使用wasm-bindgen进行Rust wasm vs js速度基准测试时,我遇到了一个问题。

我做了一个简单的结构,如下所示:

enter image description here

我在名为 gimmeDirections 的简单函数中使用了此结构 如下所示:

enter image description here

将其编译为浏览器JavaScript之后,我查看了已编译到其中的.d.ts文件,并注意到gimmeDirections函数返回了一个数字。

enter image description here

即使在js中,它也会在JSDOC中声明它返回了XY类,该类是在编译后的代码中定义的。

enter image description here

这是课程:

export class XY {

    static __wrap(ptr) {
        const obj = Object.create(XY.prototype);
        obj.ptr = ptr;

        return obj;
    }

    free() {
        const ptr = this.ptr;
        this.ptr = 0;

        wasm.__wbg_xy_free(ptr);
    }
    /**
    * @returns {number}
    */
    get x() {
        var ret = wasm.__wbg_get_xy_x(this.ptr);
        return ret;
    }
    /**
    * @param {number} arg0
    */
    set x(arg0) {
        wasm.__wbg_set_xy_x(this.ptr,arg0);
    }
    /**
    * @returns {number}
    */
    get y() {
        var ret = wasm.__wbg_get_xy_y(this.ptr);
        return ret;
    }
    /**
    * @param {number} arg0
    */
    set y(arg0) {
        wasm.__wbg_set_xy_y(this.ptr,arg0);
    }
}

在感到非常困惑之后,由于打字稿说它将返回一个数字,而js说它将返回一个类,我决定运行它并得到一个数字。

enter image description here

下面的对象是我的javascript函数,它为基准测试运行相同的代码,如您所见,我得到了一个对象,而不是数字。

这是我的JS代码

import * as funcs from './wasm/wildz.js';
// compiled wasm js file
function directionsJS(x,y) {
    let xX = x;
    let yY = y;
    if (Math.abs(xX) === Math.abs(yY)) {
        xX /= Math.SQRT2;
        yY /= Math.SQRT2;
    }
    return {
        x: x,y: yY
    };
}
(async() => {
    const game = await funcs.default();
    console.time('Rust Result'); console.log(game.gimmeDirections(10,10)); 
    console.timeEnd('Rust Result'); console.time('JS Result'); 
    console.log(directionsJS(10,10)); console.timeEnd('JS Result');
})();

我仍然很困惑为什么当我明确返回一个对象时它为什么要返回数字。迫切需要帮助,并且感激不尽

解决方法

在wasm-bindgen指南的Exporting a struct to JS中对此进行了更多的解释,但我将进行总结。

通过动态分配锈结构并为其返回指针来“返回”锈结构。关于返回number的函数,您所看到的是绑定了JS运行时和wasm模块的“原始” ffi函数。它只是返回该指针值。

生成的XY Javascript类是该指针值的包装,并提供了与之交互的功能。生成的gimmeDirections函数是对创建该类的wasm模块调用的包装。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?