Rust Wasm Bindgen返回对象,但获取一个数字

Rust Wasm Bindgen返回对象,但获取一个数字,rust,webassembly,wasm-bindgen,rust-wasm,Rust,Webassembly,Wasm Bindgen,Rust Wasm,今天,在使用wasm bindgen进行rust wasm vs js速度基准测试时,我遇到了一个问题 我制作了一个简单的结构,你可以在这里看到: 我在一个名为gimmeDirections的简单函数中使用了这个结构 如图所示: 在将它编译成浏览器javascript之后,我查看了编译成它的.d.ts文件,发现gimmeDirections函数返回了一个数字。 即使在js中,它也在JSDOC中声明它返回了在编译代码之前定义的XY类。 下面是课堂: 导出类XY{ 静态包装(ptr){ co

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

我制作了一个简单的结构,你可以在这里看到:

我在一个名为gimmeDirections的简单函数中使用了这个结构 如图所示:

在将它编译成浏览器javascript之后,我查看了编译成它的.d.ts文件,发现gimmeDirections函数返回了一个数字。

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

下面是课堂:

导出类XY{
静态包装(ptr){
const obj=Object.create(XY.prototype);
obj.ptr=ptr;
返回obj;
}
免费的{
const ptr=this.ptr;
这个值为0.ptr=0;
无废物(ptr);
}
/**
*@返回{number}
*/
得到x(){
var ret=wasm.\uuuwbg\uget\uxy\ux(this.ptr);
返回ret;
}
/**
*@param{number}arg0
*/
集合x(arg0){
wasm.\uuuuwbg\uxy\ux(this.ptr,arg0);
}
/**
*@返回{number}
*/
得到y(){
var ret=wasm.\uuwbg\uget\uxy\y(this.ptr);
返回ret;
}
/**
*@param{number}arg0
*/
集合y(arg0){
wasm.\uuuuwbg\uxy\uy(this.ptr,arg0);
}
}
在非常困惑之后,由于typescript说它将返回一个数字,而js说它将返回一个类,所以我决定运行它。。。并且得到了一个号码。

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

以下是我的JS代码:

import*作为函数从“/wasm/wildz.js”导入;
//编译的wasm js文件
函数方向js(x,y){
设xX=x;
设yY=y;
if(数学绝对值(xX)==数学绝对值(yY)){
xX/=Math.SQRT2;
yY/=Math.SQRT2;
}
返回{
x:x,
y:yY
};
}
(异步()=>{
const game=wait funcs.default();
console.time('Rust Result');console.log(game.gimmeditions(10,10));
console.timeEnd('Rust Result');console.time('JS Result');
console.log(directionsJS(10,10));console.timeEnd('jsresult');
})();

我仍然很困惑,为什么它会返回一个数字,而我显然是在返回一个对象。非常需要帮助,非常感谢

wasm bindgen指南中对这一点和更多内容进行了解释,但我将进行总结

Rust结构是通过动态分配空间并返回指向它的指针来“返回”的。关于返回
number
的函数,您看到的是绑定JS运行时和wasm模块的“原始”ffi函数。它只返回那个指针值


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

简而言之:看看
XY.\u wrap
在JavaScript中做了什么,这也许可以回答你的问题。@Cerberus我还是不明白:C它似乎是从原型中创建一个对象,然后分配传递给它的任何内容function@Artrix你还在等什么?这个链接已经告诉了你需要知道的关于这个问题的一切。如果问题变得更好,我会很高兴取消否决票。所以我应该做一些像new XY(gimmeDirections(10,10))?不。你说过你用一种方法来获得一个数字,你用另一种方法来获得一个对象。所以,用你得到物体的方式来称呼它。你忽略了在你的帖子中包括你为了得到这些结果而实际做了什么,所以我不能直接说你应该做什么。一个是模块本身的成员函数,另一个是导出的自由函数.console.time('Rust Result');console.log(game.gimmeditions(10,10));console.timeEnd(“生锈结果”);console.time('jsresult');log(directionsJS(10,10));console.timeEnd('jsresult');什么是
game
,什么是
directionsJS
?您应该将该信息和上述日志示例添加到原始帖子中。不包含与您的问题相关的代码(如文本)会使直接回答您的问题变得更加困难,并导致这些冗长的评论线索。谢谢您的提示!我已经在问题中添加了javascript代码