- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада сообщить о двух новых версиях Rust: 1.22.0 и 1.22.1. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.
Подождите, две версии? В последний момент мы обнаружили проблему с новой macOS High Sierra [1] в версии 1.22.0 и по разным причинам выпустили версию 1.22.0 как обычно, но так же выпустили 1.22.1 с исправлением. Ошибка была найдена в менеджере пакетов Cargo, а не в
rustc
, и затронула только пользователей macOS High Sierra.
Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:
$ rustup update stable
Если же у вас еще не установлен rustup
, вы можете установить его [2] с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.22.0 [3] и 1.22.1 можно ознакомиться на GitHub.
Самое главное изменение в этой версии, которого многие долго ждали: теперь вы можете использовать ?
с Option<T>
[4]! Около года назад, в Rust 1.13 [5], мы ввели оператор ?
для работы с Result<T, E>
. С тех пор ведутся дискуссии о том, как далеко оператор ?
должен зайти: Должен ли он остаться только для Result
? Разрешать ли пользователям расширять его? Должен ли он использоваться с 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);
Однако, эта функциональность по-прежнему немного ограничена. Например, вы не можете написать код, который сочетает Result
ы и Option
ы с оператором ?
в одной функции. Это будет реализовано в позже — в ночной версии Rust уже есть такая возможность. Ожидайте новостей об этом в будущих версиях.
Типы, которые реализуют Drop
, теперь разрешено использовать в const
и static
[6]. Например:
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
.
Так же, было добавлено несколько приятных мелочей:
Два [7] недавних изменения компилятора [8] должны ускорить скорость сборки в отладочном режиме. У нас нет точных цифр, но, как и всегда, уменьшение времени сборки остается одной из наших приоритетных задач.
T op= &T
теперь работает для примитивных типов [9], что проще показать на примере:
let mut x = 2;
let y = &8;
// раньше это не работало:
x += y;
Раньше вам бы пришлось написать x += *y
что бы разыменовать ссылку.
В MacOS улучшены бэктрейсы [10].
Теперь вы можете создавать compile-fail
тесты в Rustdoc [11], например:
/// ```compile_fail
/// let x = 5;
/// x += 2; // не должно собираться!
/// ```
Обращаем ваше внимание на то что подобные тесты менее надежны, так как дополнительные возможности Rust могут заставить работать ранее не собиравшийся код. Например, как это было с ?
: код не собирался с Rust 1.21, но теперь работает с Rust 1.22, вызывая падение вашего теста.
Наконец, мы убрали поддержку цели le32-unknown-nacl
[12]. Google сам объявил PNaCl устаревшим [13], что бы направить все силы на поддержку WebAssembly [14]. Вы уже сейчас можете собрать Rust код в WebAssembly и вы можете ожидать новостей о развитии его поддержи в новых выпусках Rust.
Подробности смотрите в примечаниях к выпуску [3].
В этом выпуске было стабилизировано несколько новых API:
Box<Error>
теперь реализует From<Cow<str>>
[15]std::mem::Discriminant
теперь гарантированно будет Send + Sync
[16]fs::copy
теперь возвращает длину главного потока на NTFS [17]Корректное определение переполнения Instant += Duration
[18]Реализация Hasher
для {&mut Hasher, Box<Hasher>}
[19]Реализация fmt::Debug
для SplitWhitespace
[20]Подробности смотрите в примечаниях к выпуску [3].
Если вы хотите показать большой пример пользователям, то у Cargo появилась возможность создать примеры из нескольких файлов [21], создав внутри examples
поддиректорию с main.rs
.
Теперь у Cargo есть возможность локальной подмены (vendoring) git репозиториев [22].
Подробности смотрите в примечаниях к выпуску [3].
Множество людей участвовало в разработке Rust 1.22. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо! [23] (и снова Спасибо! [24])
Авторы перевода: @BORN2LOSE [25] и ozkriff [26]. Спасибо vitvakatu [27] за помощь в переводе
Автор: Андрей Лесников
Источник [28]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/269012
Ссылки в тексте:
[1] обнаружили проблему с новой macOS High Sierra: https://github.com/rust-lang/rust/pull/46183
[2] установить его: https://www.rust-lang.org/install.html
[3] подробными примечаниями к выпуску Rust 1.22.0: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1220-2017-11-22
[4] можете использовать ?
с Option<T>
: https://github.com/rust-lang/rust/pull/42526
[5] Rust 1.13: https://blog.rust-lang.org/2016/11/10/Rust-1.13.html
[6] теперь разрешено использовать в const
и static
: https://github.com/rust-lang/rust/pull/44456
[7] Два: https://github.com/rust-lang/rust/pull/45075
[8] изменения компилятора: https://github.com/rust-lang/rust/pull/45064
[9] T op= &T
теперь работает для примитивных типов: https://github.com/rust-lang/rust/pull/44287
[10] В MacOS улучшены бэктрейсы: https://github.com/rust-lang/rust/pull/44251
[11] создавать compile-fail
тесты в Rustdoc: https://github.com/rust-lang/rust/pull/43949
[12] убрали поддержку цели le32-unknown-nacl
: https://github.com/rust-lang/rust/pull/45041
[13] объявил PNaCl устаревшим: https://blog.chromium.org/2017/05/goodbye-pnacl-hello-webassembly.html
[14] WebAssembly: http://webassembly.org/
[15] Box<Error>
теперь реализует From<Cow<str>>
: https://github.com/rust-lang/rust/pull/44466
[16] std::mem::Discriminant
теперь гарантированно будет Send + Sync
: https://github.com/rust-lang/rust/pull/45095
[17] fs::copy
теперь возвращает длину главного потока на NTFS: https://github.com/rust-lang/rust/pull/44895
[18] Корректное определение переполнения Instant += Duration
: https://github.com/rust-lang/rust/pull/44220
[19] Реализация Hasher
для {&mut Hasher, Box<Hasher>}
: https://github.com/rust-lang/rust/pull/44015
[20] Реализация fmt::Debug
для SplitWhitespace
: https://github.com/rust-lang/rust/pull/44303
[21] возможность создать примеры из нескольких файлов: https://github.com/rust-lang/cargo/pull/4496
[22] локальной подмены (vendoring) git репозиториев: https://github.com/rust-lang/cargo/pull/3992
[23] Спасибо!: https://thanks.rust-lang.org/rust/1.22.0
[24] снова Спасибо!: https://thanks.rust-lang.org/rust/1.22.1
[25] @BORN2LOSE: https://github.com/BORN2LOSE
[26] ozkriff: https://habrahabr.ru/users/ozkriff/
[27] vitvakatu: https://habrahabr.ru/users/vitvakatu/
[28] Источник: https://habrahabr.ru/post/343058/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.