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

cur*_*nii 8 vector rust typed-arrays wasm-bindgen

我有一个Vec我想返回并使用 wasm-bindgen 转换为类型化数组,即将 a 转换Vec<u32>Uint32Array. 根据我的研究,wasm-bindgen 现在无法自动处理这些转换(就像它所做的那样String),而您必须使用js-sys板条箱。然而,我还没有找到如何使用这个板条箱的明确示例。如果可以提供如何使用它的清晰简单的示例,我们将不胜感激。

为了完整起见,如果答案能够解释如何公开返回 a 的函数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>,
}
Run Code Online (Sandbox Code Playgroud)

Max*_*axV 4

您可以将 a 转换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[..]);
}
Run Code Online (Sandbox Code Playgroud)

并且可以通过创建 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[..]);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,切片是对值的引用,因此您不会将某些内容“转换”为切片,而是“创建”切片。您可以使用“&amp;inner_func()[..]”创建整个向量的切片,并且不需要将其存储在中间变量中,因此函数的整个主体可以简化为仅此行:“js_sys” ::Uint32Array::from(&amp;inner_func()[..])` 请注意,`return` 和分号也是不必要的。 (3认同)