我有一个
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>,
}
您可以将
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[..]);
}
}
从 wasm-bindgen v0.2.88 开始,你可以简单地返回一个
Vec<u8>
(或 Box<[u8]>
等),它会自动转换为类型化数组供 JS 使用。同样,类型化数组可以从 JS 传入,并转换为 Box<[u8]>
。
#[wasm_bindgen]
pub fn decode(buffer: Box<[u8]>) -> Vec<u8> { ... }