使用wasm_bindgenwith serde,我尝试JsValue使用惯用的 rust 返回一个复杂的结构。我创建了一个单独的示例来说明我所看到的错误。
结构声明:
#[derive(Serialize)]
pub struct BookStoreData {
pub h: HashMap<String, String>,
pub name: String,
}
Run Code Online (Sandbox Code Playgroud)
函数定义:
#[wasm_bindgen]
pub fn hello_hash(count: i32) -> Result<JsValue, JsValue> {
set_panic_hook();
let mut book_reviews = HashMap::new();
book_reviews.insert(
"Grimms' Fairy Tales".to_string(),
"Masterpiece.".to_string(),
);
let data = BookStoreData {
h: book_reviews,
name: "My Book Store".to_string(),
};
let js_result: JsValue = JsValue::from_serde(&data).unwrap();
OK(js_result)
}
Run Code Online (Sandbox Code Playgroud)
我收到此编译错误:
error[E0425]: cannot find function `OK` in this scope
--> src/hello_whatever.rs:46:5
|
46 | OK(js_result)
| …Run Code Online (Sandbox Code Playgroud) 我正在努力让 webpack 处理一组使用 wasm-bindgen 编译的WebAssembly 文件。
即使这可能只是 webpack 的一个问题,它也让我意识到我没有完全掌握这些古怪的 WebAssembly 工具之间的差异。
从这篇文章https://asquera.de/blog/2018-10-01/web assembly- and-wasm-bindgen/ 我发现我们可以运行wasm-bindgen target/wasm32-unknown-unknown/release/qr_wasm.wasm --out-dir ./dist --no-modules --no-typescript来创建 wasm 和 js 文件而不运行wasm-pack build(它会安装 wasm-bindgen 无论我是否以前安装过一个,使它有点慢)这对我来说似乎更灵活,但当我运行时wasm-bindgen xxx它说:zsh: command not found: wasm-bindgen
我用谷歌搜索了一下,但似乎没有人遇到过这个问题。我的项目中还有cargo installwasm-bindgen 和 wasm-bindgen-cli 。
我定义了一个元组结构:
pub struct ChangedCell(pub bool, pub u32, pub u32);
Run Code Online (Sandbox Code Playgroud)
我的假设
ChangedCell重 9 个字节(bool:1 个字节,u32:4 个字节,u32:4 个字节)
我做了什么
我向 JavaScript返回了一个pointer, lengthfor :Vec<ChangedCell>
pub struct ChangedCell(pub bool, pub u32, pub u32);
Run Code Online (Sandbox Code Playgroud)
const arr = new Uint8Array(memory.buffer, pointer, length * 9);
Run Code Online (Sandbox Code Playgroud)
预期行为
isVal成为valid [byte]val1成为valid [byte] * 4val2成为valid [byte] * 4问题
I am getting Garbage values!
如何将这样的内容读入 JavaScript 中?