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)
如何解决这个问题?
我相信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)