rust WASM & Deno /提取和操作日期数组

2uluyalo  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(121)

我尝试在Deno的WASM项目中的一个函数中提取和操作一个日期数组
rust函数无法编译。如何操作Date并转换它?
有人有Rust + Deno库的示例库/链接吗?

货物清单

[dependencies]
wasm-bindgen = "=0.2.87"
time = { version = "0.3", features = ["parsing", "macros"] }
js-sys = "0.3.64"

字符串

mod.ts

import { instantiate } from "./lib/rs_lib.generated.js";

const { DateArrayToString } = await instantiate();

console.log(DateArrayToString( [new Date(2015, 11, 1 ), new Date(2016, 7, 1 ), new Date(2016, 7, 19 )]))

库文件

use wasm_bindgen::prelude::*;

use js_sys::Array;
use js_sys::Date;

#[wasm_bindgen]
pub fn DateArrayToString(arr:Array) -> JsString {
    let result : JsString;
    for i in 0..arr.length() {
        // problem is here
        let d : Date = arr.get(i).as_ref();
        // Concat
        result = result.concat(d.to_string());
    }
    return result;
}

zzzyeukh

zzzyeukh1#

您当前的实现存在多个问题。您目前面临的编译错误是因为类型不匹配。
您可以通过将JsValue转换为js_sys::Date来修复此问题,如下所示:

let d : Date = arr.get(i).into();

字符串
这将导致另一个编译错误,因为result可能未初始化。这可以像这样修复:

let result: JsString = JsString::from("");


然后你需要使result可变,因为它在循环中被覆盖:

let mut result: JsString = JsString::from("");


最后,你需要借用,因为concat方法期望借用它的参数:

result = result.concat(&d.to_string());


因此,具有最小更改的完整固定代码看起来像这样:

use wasm_bindgen::prelude::*;

use js_sys::Array;
use js_sys::JsString;
use js_sys::Date;

#[wasm_bindgen]
pub fn DateArrayToString(arr:Array) -> JsString {
    let mut result : JsString = JsString::from("");
    for i in 0..arr.length() {
        // problem is here
        let d : Date = arr.get(i).into();
        // Concat
        result = result.concat(&d.to_string());
    }
    return result;
}


然而,这是不必要的复杂,违反了一些常见的生 rust 标准,这就是为什么我会建议目标是类似下面发布的代码。
改进代码:

use js_sys::{Array, Date, JsString};
use wasm_bindgen::prelude::*;

#[wasm_bindgen(js_name = DateArrayToString)]
pub fn date_array_to_string(arr: Array) -> JsString {
    let mut result = JsString::from("");
    for date_value in arr.values() {
        let d: Date = date_value.expect("Some error occured.").into();
        result = result.concat(&d.to_string());
    }

    result
}

相关问题