如何使用web_sys从Rust创建一个JS字符串数组?

我正在尝试使用一个包含一个方法的Web API,该方法接受来自Rust的字符串数组,我正在使用web_sys与JS API "对话",但我无法找到传递静态字符串数组的方法。

我正在使用web_sys与JS API "对话",但我找不到一种方法将一个静态Strings数组传入其中。

不幸的是,在 Rust 中,参数的类型被错误地声明为 arg: &JsValue所以我可以将任何东西传入它,它仍然可以编译,但在浏览器中崩溃。

我怎样才能在Rust中创建一个字符串数组,以作为 &JsValue?

0
投票

通过使用 js_sys 你可以创建这样的数组。

use js_sys::Array;

#[wasm_bindgen]
pub fn strings() -> Array {
    let arr = Array::new_with_length(10);
    for i in 0..arr.length() {
        let s = JsValue::from_str(&format!("str {}", i));
        arr.set(i, s);
    }
    arr
}

但你能不能举个例子,用字符串的字面意思,比如["hello"].to_array()

对于要求的例子,你不能直接使用任何方法来转换。因此,你必须使用一个辅助函数。

#[wasm_bindgen]
pub fn strings() -> Array {
    to_array(&["str 1", "str 2"])
}

pub fn to_array(strings: &[&str] ) -> Array {

    let arr = Array::new_with_length(strings.len() as u32);
    for (i, s) in strings.iter().enumerate() {
        arr.set(i as u32, JsValue::from_str(s));
    }
    arr
}
0
投票

这个函数可以转换 &[&str]JsValue:

fn js_array(values: &[&str]) -> JsValue {
    return JsValue::from(values.into_iter()
        .map(|x| JsValue::from_str(x))
        .collect::<Array>());
}