gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:36:33 29 4
gpt4 key购买 nike

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

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,1,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方法 do 迭代对值的引用而不是值本身。是的,这令人困惑。由于JsValue::fromu32 实现但不适用于 &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()
}

关于arrays - 无法将迭代器转换为 js_sys::Array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65429723/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com