Почему сразу две версии? Чтобы задницы злопыхателей и критиков частых релизов полыхали ещё сильнее! (Как вариант, потому что 1.22.1 содержит патч, устраняющий баг в релизе 1.22, проявляющийся в Cargo у пользователей ОС macOS High Sierra, но это неточно.)
Что нового?
- Основная фича: теперь вы можете использовать ? с Option<T>:
fn try_option_some() -> Option<u8> { let val = Some(1)?; Some(val) } assert_eq!(try_option_some(), Some(1)); fn try_option_none() -> Option<u8> { let val = None?; Some(val) } assert_eq!(try_option_none(), None);
Пока функциональность ограничена; так, вы не можете писать код, который смешивает
Result
'ы иOption
'ы в одной и той же функции, к примеру. Это станет возможным в прекрасном далёко. - Типы, реализующие
Drop
теперь доступны в `const` и `static` определениях:struct Foo { a: u32, } impl Drop for Foo { fn drop(&mut self) {} } const F: Foo = Foo { a: 0 }; static S: Foo = Foo { a: 0 };
Ничего особенного, но, согласитесь, приятно.
- Два последних изменения в компиляторе должны ускорить компиляцию в режиме отладки.
T op= &T
теперь работает для примитивных типов:let mut x = 2; let y = &8; // это не работало ранее, но теперь работает x += y;
А раньше бы пришлось использовать разыменование:
x += *y
.- Улучшенные бэктрейсы на macOS.
- Теперь вы можете создавать `compile-fail` тесты в Rustdoc:
/// ```compile_fail /// let x = 5; /// x += 2; // shouldn't compile! /// ```
- Наконец, мы удалили `le32-unknown-nacl` из поддерживаемых целей сборки. Google отказался от PNaCl в пользу WebAssembly. Вы уже можете компилировать Rust код в WebAssembly.
Подробно обо всём этом — в примечаниях к выпуску.
Стабилизация stdlib
Несколько новых API было стабилизировано в этом выпуске:
- Box<Error> теперь реализует From<Cow<str>>
- std::mem::Discriminant теперь гарантированно будет Send + Sync
- fs::copy теперь возвращает длину главного потока (stream) в NTFS.
- Правильное определение переполнения в Instant += Duration.
- impl Hasher for {&mut Hasher, Box<Hasher>}
- impl fmt::Debug for SplitWhitespace.
Cargo
- Если у вас есть большой пример, который вы хотите показать пользователям вашего кода, Cargo позволяет теперь создавать мультифайловые примеры путём указания поддиректории внутри `examples`, содержащей `main.rs`.
- Отныне Cargo обеспечивает возможность использовать git репозитории как источники для разрешения зависимостей исходного кода.