如何使用 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()
这样的字符串文字的例子吗?
看看新版本
正如我在问题中提到的,我需要&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)` 未正确格式化二进制数据