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

Mat*_*eus 5 rust webassembly

我正在尝试将结构从 Rust 导出到 WebAssembly,但出现以下错误:

未捕获(承诺中)类型错误:wasm.Test 不是构造函数

锈:

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,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

导出结构体的正确方法是什么?

Val*_*tin 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();
Run Code Online (Sandbox Code Playgroud)