如何使用 wasm-bindgen 将 Vec 作为类型化数组返回?

How can a Vec be returned as a typed array with wasm-bindgen?

我有一个 Vec 我想 return 并使用 wasm-bindgen 转换为类型化数组,即将 Vec<u32> 变成 Uint32Array .从我的研究来看,wasm-bindgen 似乎无法立即自动处理它们本身的转换(就像它对 String 所做的那样),您必须使用 js-sys 板条箱。然而,我还没有找到 如何 使用这个箱子的明确例子。如果能提供一个清楚的简单示例说明如何使用它,我们将不胜感激。

为了完整起见,如果答案能够解释如何公开一个函数 returning 一个 Vec<u32> 以及一个结构成员,那就太好了,即,你如何转换将这些定义转化为可行的东西:

#[wasm_bindgen]
pub fn my_func() -> Vec<u32> {
    inner_func() // returns Vec<u32>
}

#[wasm_bindgen]
pub struct my_struct {
    #[wasm_bindgen(readonly)]
    pub my_vec: Vec<u32>,
}

您可以将 Vec<u32> 转换为 js_sys::Uint32Array。所以你的 my_func 看起来像:

#[wasm_bindgen]
pub fn my_func() -> js_sys::Uint32Array {
    let rust_array = inner_func();
    return js_sys::Uint32Array::from(&rust_array[..]);
}

并且可以通过 getter:

来公开该结构
#[wasm_bindgen]
pub struct my_struct {
    // Note: not pub
    my_vec: Vec<u32>,
}

#[wasm_bindgen]
impl my_struct {
    #[wasm_bindgen(getter)]
    pub fn my_vec(&self) -> js_sys::Uint32Array {
        return js_sys::Uint32Array::from(&self.my_vec[..]);
    }
}