chrono 杀死了我的 Rust WebAssembly 函数

Pau*_*thy 2 rust c++-chrono webassembly

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

以下行似乎终止了该函数,但它什么都不返回(无文本,无错误)

让 dt = Utc::now();

如果我注释掉该行,该函数会像以前一样运行并返回一个字符串

这是否发生在其他人身上?程序员如此喜欢的语言会以如此令人讨厌的方式行事,这对我来说似乎很奇怪。

我的 rs 文件顶部有以下 2 行:extern crate chrono; 使用 chrono::{Duration, Utc};

我在 toml 文件 chrono = "0.4" 的依赖项中有以下内容

Cer*_*rus 6

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

但是,我无法在文档中找到它。源代码中引用此功能:

#[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)
}
Run Code Online (Sandbox Code Playgroud)

此外,还有一个未解决的问题用于记录此行为。


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

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