在JavaScript中,我可以这样做:
JSON.stringify([1,2,3]) === JSON.stringify([1,2,3]) // true
在编译为Wasm的Rust中,我尝试了类似的东西:
#[wasm_bindgen_test]
fn test_algo() {
let js_array_to_sort = Array::of3(&JsValue::from(1), &JsValue::from(3), &JsValue::from(2));
let js_array_after_sort = Array::of3(&JsValue::from(1), &JsValue::from(2), &JsValue::from(3));
let array = JsValue::from(&js_array_to_sort);
assert_eq!(
JSON::stringify(BubbleSort::sort(SortArray::new(array))).unwrap(),
JSON::stringify(JsValue::from(&js_array_after_sort)).unwrap(),
);
}
它引发了一些错误,wasm-pack test --chrome
关于partialeq
没有JsString
- JSON::stringify
的结果:
error[E0277]: can't compare `js_sys::JsString` with `js_sys::JsString`
--> src/algorithms/bubble.rs:36:5
|
36 | / assert_eq!(
37 | | JSON::stringify(&BubbleSort::sort(SortArray::new(array))).unwrap(),
38 | | JSON::stringify(&JsValue::from(&js_array_after_sort)).unwrap(),
39 | | );
| |______^ no implementation for `js_sys::JsString == js_sys::JsString`
|
= help: the trait `std::cmp::PartialEq` is not implemented for `js_sys::JsString`
如果我尝试转换为字符串并以其他方式进行比较(例如直接使用JsString
方法),我总是得到相同类型的编译错误。
如果我尝试直接比较这个数组,我在JavaScript中有类似的行为:
JsValue([1,2,3]) == JsValue([1,2,3]) // false
在Cargo.toml
我有:
[dependencies]
wasm-bindgen = "0.2.39"
js-sys = "0.3.16"
wasm-bindgen-test = "0.2.39"
我该如何进行这种比较?
编辑。
我想出了这样的东西来通过这个测试:
assert_eq!(
String::from(JSON::stringify(&BubbleSort::sort(SortArray::new(array))).unwrap()),
String::from(JSON::stringify(&JsValue::from(&js_array_after_sort)).unwrap()),
);
如果我理解正确,你不应该比较它们。它们没有实现Eq
或PartialEq
,因此您无法比较它们的切片或数组。
事实上,他们甚至不住在Rust内部,只是外部值的索引。
您可能无法对它们进行排序,因为它们没有实现Ord
。
执行此操作的惯用方法是使用as_f64
方法将它们转换为Rust基元,然后执行您需要的任何操作。
如果你有一个TypedArray
会更容易,它可以很容易地转换为vec。
let js_array_to_sort = Array::of3(&JsValue::from(1), &JsValue::from(3), &JsValue::from(2));
let rust_vec = js_array_to_sort
.values().into_iter()
.map(|js_val|
js_val.as_f64().unwrap() as i64
)
.collect::<Vec<i64>>();
let mut sorted_rust_vec = rust_vec.clone();
sorted_rust_vec.sort();
dbg!(sorted_rust_vec == rust_vec);