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

Posted

技术标签:

【中文标题】如何使用 web_sys 从 Rust 创建一个 JS 字符串数组?【英文标题】:How to create a JS array of Strings from Rust using web_sys? 【发布时间】:2020-08-22 21:30:15 【问题描述】:

我正在尝试使用一个 Web API,它包含一个从 Rust 接受字符串数组的方法。

我正在使用 web_sys 与 JS API “对话”,但我找不到将静态字符串数组传入其中的方法。

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

如何在 Rust 中创建可用作&JsValue 的字符串数组?

【问题讨论】:

【参考方案1】:

这会将&[&str] 转换为JsValue

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

【讨论】:

【参考方案2】:

使用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

【讨论】:

谢谢!但是你能举一个像["hello"].to_array()这样的字符串文字的例子吗? 看看新版本 正如我在问题中提到的,我需要&amp;JsValue,而不是Array,因此代码无法编译。执行JsValue::from(array) 似乎不起作用。 可以使用示例的更改版本测试您的代码:``` #[wasm_bindgen] pub fn strings() -> JsValue to_array(&["str 1", "str 2"] ).into() ``` @Ixx 来自文档:“提供的 utf-8 字符串被复制到 JS 堆中,该字符串将归 JS 垃圾收集器所有。” rustwasm.github.io/wasm-bindgen/api/wasm_bindgen/…所以有复制但没有序列化。

以上是关于如何使用 web_sys 从 Rust 创建一个 JS 字符串数组?的主要内容,如果未能解决你的问题,请参考以下文章

`web_sys::Url::create_object_url_with_blob(&blob)` 未正确格式化二进制数据

如何创建可以在 Rust 多线程服务器中使用的结构?

如何创建具有计时时区的通用 Rust 结构?

如何使用字符串作为参数从 Go 调用 Rust 函数?

如何从主函数外部提前退出 Rust 程序?

如何在 Rust 中传递对可变数据的引用?