Как создать массив JS строк из Rust с помощью web_sys? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь использовать веб-API, который содержит метод, принимающий массив строк из Rust.

Я использую web_sys для «общения» с JS API, но не могу найти способ передать в него массив stati c Strings.

В Rust, к сожалению, тип параметра ошибочно объявлен как arg: &JsValue, поэтому я могу передать в него что угодно и он по-прежнему компилируется, но вылетает в браузере.

Как я могу создать массив строк в Rust, который можно использовать как &JsValue?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Это преобразует &[&str] в JsValue:

fn js_array(values: &[&str]) -> JsValue {
    return JsValue::from(values.into_iter()
        .map(|x| JsValue::from_str(x))
        .collect::<Array>());
}
0 голосов
/ 07 мая 2020

Используя 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...