如何使用WebAssembly构造函数定义一个Rust结构体?

5

我尝试将一个结构体从Rust导出到WebAssembly,但是遇到了以下错误:

Uncaught (in promise) TypeError: wasm.Test不是一个构造函数

Rust:

我正在尝试将一个Rust中的结构体导出到WebAssembly,但是我遇到了如下错误:
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console)]
    fn log(s: &str);
}

#[wasm_bindgen]
pub struct Test {
    pub x: i32,
}

#[wasm_bindgen]
impl Test {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Self {
        Self {
            x: 0,
        }
    }
}

JS:

import init from './wasm.js'

async function run() {
    const wasm = await init().catch(console.error);
    console.log(wasm);

    let test = new wasm.Test();

    console.log(test);
}

run();

如何正确地导出一个struct?


3
不回答问题,但对于任何想了解明显信息的人,这里是wasm-bindgen有关使用构造函数导出的参考文档,其中包括与此问题中的代码相匹配的内容 — 除了中间的wasm.js模块。为了确保情况,你能展示下你的./wasm.js模块中有什么吗? - Kevin Reid
当我导入Test类时,它可以工作。在wasm变量中,我只能访问一些函数。我不确定原因是什么。 - Matheus
1个回答

0
请注意,当解析init()时,它会返回WASM模块的导出项。因此,您不会找到Test,而是会找到test_new,它代表了Test::new。在执行console.log(wasm);后,这应该在控制台中可见。
要解决您的问题,您需要导入Test,而不是最初导入init
import init, { Test } from './wasm.js';

async function run() {
    const wasm = await init().catch(console.error);
    console.log(wasm);

    let test = new Test();
    console.log(test);
}

run();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接