chrono убивает мою функцию Rust WebAssembly - PullRequest
0 голосов
/ 02 августа 2020

Программисты очень довольны Rust, поэтому я решил попробовать. У меня есть Hello World WebAssembly, и я попытался добавить код, чтобы показать время.

Следующая строка, кажется, убивает функцию, и она ничего не возвращает (без текста, без ошибки)

let dt = Ut c :: now ();

Если я закомментирую строку, функция будет работать как раньше и вернет строку

Это происходит с кем-нибудь еще? Мне кажется странным, что язык, который так нравится программистам, ведет себя так раздражающе.

У меня есть две строчки в верхней части моего rs-файла: extern crate chrono; use chrono :: {Duration, Utc};

У меня есть следующие зависимости в файле toml chrono = "0.4"

1 Ответ

4 голосов
/ 02 августа 2020

Для использования в 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)
}

Кроме того, существует открытая проблема для документирования этого поведения.

Существует несколько причин такого поведения.

  1. Получение текущего времени обычно является функцией стандартной библиотеки. В частности, для целей, не относящихся к WASM, chrono вызывает функцию get_time из ящика time, которая затем может делегировать libc или чему-то еще, в зависимости от цели. Однако, когда вы компилируете в WASM, стандартная библиотека довольно ограничена - например, нет системных вызовов, и поэтому набор функций должен быть обеспечен другими способами; в частности, вышеупомянутая функция get_time является явно нереализованной для этой цели, так что любой ее вызов приведет к c.
  2. Авторы библиотеки обычно не хотят, чтобы вы заставляли строить зависимости, которые вам не нужны. В частности, если некоторая зависимость (здесь js-sys) необходима только для некоторых целей, она будет скрыта за флагом функции, так что пользователи библиотеки (здесь chrono), например, Windows или Linux будут не тяните без надобности. Вот почему вам нужно включить эту функцию явно, даже если без нее библиотека будет непригодна для использования на вашей цели.
  3. Последний бит информации - это ограниченная обработка ошибок в WASM: по сути, единственное, что он может сделать по умолчанию остановка на пани c. Некоторую помощь здесь может оказать console_error_panic_hook crate , который при добавлении в ваш проект покажет вам ошибку «еще не реализовано» в окне консоли.
...