【问题标题】:chrono kills my Rust WebAssembly functionchrono 杀死了我的 Rust WebAssembly 函数
【发布时间】:2020-11-22 10:20:26
【问题描述】:

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

以下行似乎杀死了函数并且它什么也不返回 (没有文字,没有错误)

让 dt = Utc::now();

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

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

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

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

【问题讨论】:

  • 你的完整代码是什么..?

标签: rust webassembly chrono


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2015-04-29
    • 2014-11-06
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多