如何从 wasm 返回一个元组到前端?

Gua*_*gWu 3 frontend rust webassembly wasm-bindgen wasm-pack

我是网络组装新手。我想使用 canvas 和 来创建一个简单的贪吃蛇游戏wasm_bindgen

我的生锈代码:

#[wasm_bindgen]
impl CanvasData {
    pub fn index_to_coordinate(&self, index: usize) -> (usize, usize) {
      (index % self.cell_count, index / self.cell_count)
    }
}
Run Code Online (Sandbox Code Playgroud)

CanvasData是一个保存画布数据的结构体,cell_count属性为usizetype,代表方形画布上水平和垂直格子的数量。这里我把画布上所有的网格从左到右、从上到下看成一个一维数组。该方法的目的是将数组索引映射到x、y坐标。我想返回一个元组并在前端调用它,如下所示:

const [x, y] = canvasData.index_to_coordinate(100)
Run Code Online (Sandbox Code Playgroud)

然而,在构建过程中出现了错误。

构建脚本:

wasm-pack build -t web
Run Code Online (Sandbox Code Playgroud)

错误:

error[E0277]: the trait bound `(usize, usize): IntoWasmAbi` is not satisfied
[0]   --> src\lib.rs:16:1
[0]    |
[0] 16 | #[wasm_bindgen]
[0]    | ^^^^^^^^^^^^^^^ the trait `IntoWasmAbi` is not implemented for `(usize, usize)`
[0]    |
[0]    = help: the trait `IntoWasmAbi` is implemented for `()`
[0]    = note: required because of the requirements on the impl of `ReturnWasmAbi` for `(usize, usize)`
[0]    = note: this error originates in the attribute macro `wasm_bindgen::prelude::__wasm_bindgen_class_marker` (in Nightly builds, run with -Z macro-backtrace for more info)
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

pig*_*nds 6

我相信tuples目前不允许,因为wasm-bindgen正在等待将元组添加到 javascript,因此 rust 和 js 之间未来不会出现不一致/损坏。这里有一个关于wasm-bindgen请求tuples固定大小数组的未决问题。

目前,最好的方法可能是创建一个元组结构。

#[wasm_bindgen]
pub struct Coordinates(pub usize, pub usize);
Run Code Online (Sandbox Code Playgroud)

然后你可以用同样的方式在javascript中解构它。

#[wasm_bindgen]
pub struct Coordinates(pub usize, pub usize);
Run Code Online (Sandbox Code Playgroud)

或者使用具有命名字段的结构并解构该对象

#[wasm_bindgen]
pub struct Coordinates{
   pub x: usize,
   pub y: usize
}
Run Code Online (Sandbox Code Playgroud)
const [x, y] = canvasData.index_to_coordinate(100)
Run Code Online (Sandbox Code Playgroud)