Выпуск Rust 1.22 (и 1.22.1)
Команда Rust рада сообщить о двух новых версиях Rust: 1.22.0 и 1.22.1. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.
Подождите, две версии? В последний момент мы обнаружили проблему с новой macOS High Sierra в версии 1.22.0 и по разным причинам выпустили версию 1.22.0 как обычно, но так же выпустили 1.22.1 с исправлением. Ошибка была найдена в менеджере пакетов Cargo, а не в
rustc
, и затронула только пользователей macOS High Sierra.
Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:
1 | $ rustup update stable
|
Если же у вас ещё не установлен rustup
, вы можете установить его
с соответствующей страницы нашего веб-сайта.
С подробными примечаниями к выпуску Rust 1.22.0 и 1.22.1
можно ознакомиться на GitHub.
Что вошло в стабильную версии 1.22.0 и 1.22.1
Самое главное изменение в этой версии, которого многие долго ждали: теперь вы
можете использовать ?
с Option<T>
!
Около года назад, в Rust 1.13, мы ввели оператор ?
для работы с Result<T, E>
.
С тех пор ведутся дискуссии о том, как далеко оператор ?
должен зайти:
Должен ли он остаться только для Result
?
Разрешать ли пользователям расширять его?
Должен ли он использоваться с Option<T>
?
В Rust 1.22, основное использование оператора ?
с Option<T>
стабилизировано.
Теперь такой код соберётся:
1 2 3 4 5 6 7 8 9 10 11 | 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
ы
с оператором ?
в одной функции.
Это будет реализовано в позже — в ночной версии Rust уже есть такая возможность.
Ожидайте новостей об этом в будущих версиях.
Типы, которые реализуют Drop
,
теперь разрешено использовать в const
и static
.
Например:
1 2 3 4 5 6 7 8 9 10 | 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
and static
.
Так же, было добавлено несколько приятных мелочей:
Два недавних изменения компилятора должны ускорить скорость сборки в отладочном режиме. У нас нет точных цифр, но, как и всегда, уменьшение времени сборки остаётся одной из наших приоритетных задач.
T op= &T
теперь работает для примитивных типов,
что проще показать на примере:
1 2 3 4 5 | let mut x = 2; let y = &8; // раньше это не работало: x += y; |
Раньше вам бы пришлось написать x += *y
что бы разыменовать ссылку.
Теперь вы можете
создавать compile-fail
тесты в Rustdoc,
например:
1 2 3 4 | /// ```compile_fail /// let x = 5; /// x += 2; // не должно собираться! /// ``` |
Обращаем ваше внимание на то что подобные тесты менее надёжны,
так как дополнительные возможности Rust могут заставить работать
ранее не собиравшийся код.
Например, как это было с ?
:
код не собирался с Rust 1.21, но теперь работает с Rust 1.22,
вызывая падение вашего теста.
Наконец, мы убрали поддержку цели le32-unknown-nacl
.
Google сам объявил PNaCl устаревшим,
что бы направить все силы на поддержку WebAssembly.
Вы уже сейчас можете собрать Rust код в WebAssembly
и вы можете ожидать новостей о развитии его поддержи в новых выпусках Rust.
Подробности смотрите в примечаниях к выпуску.
Стабилизации стандартной библиотеки
В этом выпуске было стабилизировано несколько новых API:
Box<Error>
теперь реализуетFrom<Cow<str>>
std::mem::Discriminant
теперь гарантированно будетSend + Sync
fs::copy
теперь возвращает длину главного потока на NTFS- Корректное определение переполнения
Instant += Duration
- Реализация
Hasher
для{&mut Hasher, Box<Hasher>}
- Реализация
fmt::Debug
дляSplitWhitespace
Подробности смотрите в примечаниях к выпуску.
Функциональность Cargo
Если вы хотите показать большой пример пользователям, то у Cargo появилась
возможность создать примеры из нескольких файлов,
создав внутри examples
поддиректорию с main.rs
.
Теперь у Cargo есть возможность локальной подмены git репозиториев.
Подробности смотрите в примечаниях к выпуску.
Разработчики 1.22.0 и 1.22.1
Множество людей участвовало в разработке Rust 1.22. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо! (и снова Спасибо!)
Авторы перевода: @BORN2LOSE и @ozkriff.