我正在尝试遵循Rust WebAssembly book,但在第4.2节的练习中陷于困境。我按照答案中的说明进行了更改,但是&str
函数中给定的greet
(名称)始终为空。
这是我的greet
函数的调试版本
#[wasm_bindgen]
pub fn greet(name: &str) {
if name.len() == 0 {
alert("NOT WORKING!");
} else {
alert(&format!("Hello, {}!", name));
}
}
和 www / index.js 文件:
import * as wasm from "wasm-game-of-life";
wasm.greet("213");
这是 pkg / wasm_game_of_life.js
中生成的函数/**
* @param {string} name
* @returns {void}
*/
export function greet(name) {
const ptr0 = passStringToWasm(name);
const len0 = WASM_VECTOR_LEN;
try {
return wasm.greet(ptr0, len0);
} finally {
wasm.__wbindgen_free(ptr0, len0 * 1);
}
}
我收到带有文本NOT WORKING!
的警报弹出窗口,但我希望Hello, 213
!为什么我的弦是空的?这本书过时了吗?我删除了所有内容,并从头开始没有运气...
我正在关注这本书,这是我第一次使用WebAssembly。
答案 0 :(得分:0)
我知道可能已经晚了,但我今天遇到了同样的问题,就像这样。因此,对于任何遇到此问题的人,答案如下:
当你导入 import * as wasm from "wasm-game-of-life";
时,在 wasm
变量中你有从 Rust 库中导出的模块。它包含 greet
方法,但它不是在 JS 文件中定义的方法,它是一个 C 函数,它接受两个参数,指向字符串的指针和长度。
当您使用字符串参数调用 wasm.greet()
时,您将它传递给 C 函数,而不是传递给 JS 函数 greet
- 这就是函数调用有效但实际上没有传递字符串的原因。
为了调用 JS greet
包装器,您必须显式导入它(用您的 js 文件路径替换):
import { default as wasm, greet } from "wasm-game-of-life"
wasm().then((module) => {
module.greet("Test"); // this won't work, it's C/rust greet function
console.log(module);
greet("Test"); // this should work! it's js wrapper around C function
})