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