gpt4 book ai didi

rust - chrono 杀死了我的 Rust WebAssembly 函数

转载 作者:行者123 更新时间:2023-12-03 11:27:38 24 4
gpt4 key购买 nike

程序员对 Rust 非常满意,所以我想尝试一下。我有一个 Hello World WebAssembly,我尝试添加一些代码来显示时间。
以下行似乎杀死了该函数,它什么也不返回
(没有文字,没有错误)
让 dt = Utc::now();
如果我注释掉该行,函数会像以前一样运行并返回一个字符串
这是否发生在其他人身上?
我觉得很奇怪,一种程序员如此喜欢的语言会以如此令人讨厌的方式表现。
我的 rs 文件顶部有以下两行:
外部 crate 计时;
使用 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用于记录此行为。

您看到的行为有几个原因。
  • 获取当前时间通常是标准库提供的功能。特别是对于非 WASM 目标 chrono调用get_time来自 time 的函数crate,然后可以委托(delegate)给 libc什么的,取决于目标。但是,当您编译为 WASM 时,标准库是相当有限的——例如,没有系统调用,因此必须以其他方式提供一堆功能;特别是前面提到的get_time函数是explicitly unimplemented对于这个目标,所以任何对它的调用都会 panic 。
  • 库作者通常不希望您强制构建不需要的依赖项。特别是,如果某些依赖项(此处为 js-sys )仅对某些目标是必需的,它将隐藏在功能标志后面,以便库的用户(此处为 chrono )在例如Windows 或 Linux 不会不必要地拉它。这就是为什么您需要显式启用该功能,即使没有它,该库在您的目标上也将无法使用。
  • 最后一点信息是 WASM 中有限的错误处理:本质上,默认情况下它唯一能做的就是在 panic 时停止。 console_error_panic_hook crate 可以在这里提供一些帮助,如果将其添加到您的项目中,则会在控制台窗口中向您显示“尚未实现”错误。
  • 关于rust - chrono 杀死了我的 Rust WebAssembly 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63210984/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com