微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法将迭代器转换为 js_sys::Array

如何解决无法将迭代器转换为 js_sys::Array

我正在尝试实现一种方法来发送一个 u32 数组(如果可能的话,最终是一个 of 数组的 usize),因为你不能只需在 wasm_bindgen 类型上声明一个公共数组字段。但是,使用 wasm_bindgen PR 1749 中概述的示例,我似乎无法将数组或切片转换为 js_sys::Array;它仅适用于 Vec。我的问题是,为什么?见下文

pub fn test() -> js_sys::Array {
    let arr: [u32; 5] = [0,1,2,3,4];
    let slice = &arr[0..2];
    let vec: Vec<u32> = vec![0,2];
    arr.into_iter().map(JsValue::from).collect() // This doesn't work
    slice.into_iter().map(JsValue::from).collect() // Also doesn't work
    vec.into_iter().map(JsValue::from).collect() // Works as expected!     
}

具体的错误是:the trait 'wasm_bindgen::cast::JsCast' is not implemented for 'u32'

数组和切片示例似乎不适用于任何数字类型、整数或浮点数。我唯一的想法是因为 PR 1749 中的实现似乎需要 ref,并且在堆栈上分配的数组 FromIterator 对数组中的项目无效?

是否有其他方法可以实现我要对数组执行的操作(通过 wasm_bindgen 跨边界传递给 JS),或者如果没有,为什么?我很想知道。

解决方法

虽然 Rust 数组和切片有一个 into_iter 方法,但它返回与 Iterator 方法相同的 iter,它遍历引用到值而不是价值观本身。是的,这令人困惑。由于 JsValue::from 是为 u32 而不是 &u32 实现的,因此您可以使用 Iterator<Item = &u32> 方法将 Iterator<Item = u32> 转换为 copied。固定工作示例:

use wasm_bindgen::JsValue;
use js_sys::Array;

fn array_to_js_array(array: [u32; 5]) -> Array {
    array.iter().copied().map(JsValue::from).collect()     
}

fn slice_to_js_array(slice: &[u32]) -> Array {
    slice.iter().copied().map(JsValue::from).collect()    
}

fn vec_to_js_array(vec: Vec<u32>) -> Array {
    vec.into_iter().map(JsValue::from).collect()    
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。