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

问题描述 投票:0回答:2

我有一个

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

为了完整起见,如果答案能够解释如何公开返回

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>,
}
vector rust typed-arrays wasm-bindgen
2个回答
4
投票

您可以将

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[..]);
    }
}

0
投票

从 wasm-bindgen v0.2.88 开始,你可以简单地返回一个

Vec<u8>
(或
Box<[u8]>
等),它会自动转换为类型化数组供 JS 使用。同样,类型化数组可以从 JS 传入,并转换为
Box<[u8]>

#[wasm_bindgen]
pub fn decode(buffer: Box<[u8]>) -> Vec<u8> { ... }
© www.soinside.com 2019 - 2024. All rights reserved.