为什么在Rust / Wasm初学者书籍的第4.2节中,从JavaScript传递给Wasm的字符串始终为空?

时间:2019-04-11 11:48:18

标签: rust webassembly

我正在尝试遵循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。

1 个答案:

答案 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
})