无法将迭代器转换为 js_sys::Array
Can't convert Iterators into js_sys::Array
我正在尝试实现一种方法来发送 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
is not valid for items in array?
有没有其他方法可以实现我想对数组做的事情(通过 wasm_bindgen
越过边界传递给 JS),如果没有,为什么?我很想知道。
虽然 Rust 数组和切片有一个 into_iter
方法,但它 returns 与 iter
方法相同 Iterator
,它迭代 references 到值而不是值本身。是的,这令人困惑。由于 JsValue::from
是为 u32
而不是为 &u32
实现的,因此您可以使用 copied
方法将 Iterator<Item = &u32>
转换为 Iterator<Item = u32>
。固定工作示例:
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()
}
我正在尝试实现一种方法来发送 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
is not valid for items in array?
有没有其他方法可以实现我想对数组做的事情(通过 wasm_bindgen
越过边界传递给 JS),如果没有,为什么?我很想知道。
虽然 Rust 数组和切片有一个 into_iter
方法,但它 returns 与 iter
方法相同 Iterator
,它迭代 references 到值而不是值本身。是的,这令人困惑。由于 JsValue::from
是为 u32
而不是为 &u32
实现的,因此您可以使用 copied
方法将 Iterator<Item = &u32>
转换为 Iterator<Item = u32>
。固定工作示例:
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()
}