chrono 杀死了我的 Rust WebAssembly 函数

chrono kills my Rust WebAssembly function

程序员对 Rust 非常满意,所以我想尝试一下。我有一个 Hello World WebAssembly,我试图添加一些代码来显示时间。

下一行似乎终止了该函数,但它returns什么都没有 (无文本,无错误)

让 dt = Utc::now();

如果我注释掉该函数像以前一样运行的行和 returns 一个字符串

这是否发生在其他人身上? 令我感到奇怪的是,一种程序员如此喜欢的语言会以如此令人讨厌的方式运行。

我的 rs 文件顶部有以下两行: 外部板条箱计时; 使用 chrono::{Duration, Utc};

我在toml文件的依赖项中有以下内容 计时=“0.4”

要在 WASM 中使用,chrono 必须使用 wasmbind 功能进行编译。

但是,我无法在文档中找到它。此功能被引用 in source code:

#[cfg(all(target_arch = "wasm32", not(target_os = "wasi"), feature = "wasmbind"))]
pub fn now() -> DateTime<Utc> {
    let now = js_sys::Date::new_0();
    DateTime::<Utc>::from(now)
}

此外,还有一个开放的 issue 用于记录此行为。


您看到的行为有多种原因。

  1. 获取当前时间通常是标准库提供的功能。特别是,对于非 WASM 目标,chronotime crate 调用 get_time 函数,然后它可以委托给 libc 或其他东西,具体取决于目标。但是,当您编译为 WASM 时,标准库相当有限——例如​​,没有系统调用,因此必须以其他方式提供一堆功能;特别是,前面提到的 get_time 函数对于这个目标来说是 explicitly unimplemented,所以任何调用它都会 panic。
  2. 库作者通常不希望您强制构建不需要的依赖项。特别是,如果某些依赖项(此处为 js-sys)仅对某些目标是必需的,它将隐藏在功能标志后面,以便库的用户(此处为 chrono)例如Windows 或 Linux 不会不必要地拉它。这就是为什么您需要显式启用该功能,即使没有它,该库也将无法在您的目标上使用。
  3. 最后一点信息是 WASM 中有限的错误处理:本质上,默认情况下它唯一能做的就是在恐慌时停止。 console_error_panic_hook crate 可以在此处提供一些帮助,如果将其添加到您的项目中,将在控制台中向您显示“尚未实施”错误 window。