Команда языка Rust с радостью представляет две версии языка Rust, 1.22 и 1.22.1. Rust — это системный язык программирования, который нацелен на безопасность, скорость выполнения и параллельное исполнение.
Подождите, две версии? В последний момент мы нашли баг на новой macOS High Sierra и по разным причинам решили выпустить 1.22 как обычно, а также выпустить пропатченный 1.22.1. Баг был найден в Cargo и влияет он только на пользователей macOS High Sierra.
Если у вас уже есть предыдущая версия Rust, обновите ее с помощью:
$ rustup update stable
Если у вас еще нет rustup
, то вы можете скачать его. Детальный патчноут.
Что нового в 1.22.0 и 1.22.1
Главным нововведением является возможность использования ?
для Option<T>
! Примерно год назад мы представляли оператор ?
для работы с
Result<T, E>
. С того момента началась дискуссия о будущем этого оператора. Должен он использоваться только с Result<T, E>
? Должен ли он быть расширяем пользователем?
Должен ли он использоваться с Option<T>
?
В Rust 1.22 базовое использование данного оператора с 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);
Однако его функционал все еще ограничен. Вы не сможете писать код, который совмещает использование оператора ?
для Option<T>
и Result<T, E>
в одной функции, например.
Это будет возможно в будущем и уже доступно в nightly версии. Ждите новостей об этом операторе
в будущем.
Типы, которые реализуют 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 };
Само изменение не приносит много нового, но улучшение возможности вычисления во время компиляции в будущем принесет больше возможностей для const
и static
.
Также, некоторые маленькие изменения:
Два последних изменения в компиляторе ускорят компиляцию в debug режиме. У нас нет точных чисел, но, как обычно, время компиляции очень важно для нас, поэтому мы продолжим работать в этом направлении в будущем.
T op= &T
теперь работает для примитивов:
let mut x = 2;
let y = &8;
// Теперь это будет работать
x += y;
Ранее вам нужно было писать x += *y
для разыменовывания.
Теперь вы можете создавать compile-fail
тесты в Rustdoc:
/// ```compile_fail
/// let x = 5;
/// x += 2; // shouldn't compile!
/// ``
Заметьте, что данные тесты могут опасны, потому что теперь код, который не компилировался, будет компилироваться. Например, оператор ?
: код с ним не будет компилироваться в 1.21, но успешно скомпилируется на 1.22 и, возможно, сломает ваши тесты.
Также, мы перестаем поддерживать le32-unknown-nacl
. Google уже отказались от поддержки PNaCl, направив силы на поддержку WebAssembly.
Стабилизация библиотеки
Несколько новых API были стабилизированы:
-
Box<Error>
теперь реализует[From<Cow<str>>
-
std::mem::Discriminant
теперь гарантированно будетSend + Sync
-
fs::copy
теперь возвращает длину главного потока на NTFS
Cargo
Если у вас есть какие-либо примеры для пользователей, то теперь Cargo может собирать их в поддиректории в examples
, которая содержит main.rs
.
Теперь Cargo может использовать git-репозитории для получения зависимостей.
>>> Полный патчноут