Как создать JS-массив строк из Rust с помощью web_sys?
Я пытаюсь использовать веб-API, содержащий метод, который принимает массив строк из Rust.
Я использую web_sys для "разговора" с JS API, но не могу найти способ передать в него массив статических строк.
В Rust, к сожалению, тип параметра ошибочно объявлен как arg: &JsValue
, поэтому я могу передать в него что угодно, и он все равно компилируется, но вылетает в браузере.
Как я могу создать массив строк в Rust, который можно использовать как &JsValue
?
2 ответа
Это преобразует &[&str]
к JsValue
:
fn js_array(values: &[&str]) -> JsValue {
return JsValue::from(values.into_iter()
.map(|x| JsValue::from_str(x))
.collect::<Array>());
}
С использованием 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
}