Rust 1.22.0 и 1.22.1

good-penguin.png

Команда языка 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! Примерно год назад, мы представали оператор ? для работы с Result. С того момента началась дискуссия о будущем этого оператора. Должен он использоваться только с Result? Должен ли он быть расширяем пользователем? Должен ли он использоваться с Option?

В Rust 1.22 базовое использование данного оператора с Option было стабилизировано. Теперь данный код будет компилироваться:

fn try_option_some() -> Option {
    let val = Some(1)?;
    Some(val)
}
assert_eq!(try_option_some(), Some(1));

fn try_option_none() -> Option {
    let val = None?;
    Some(val)
}
assert_eq!(try_option_none(), None);

Однако его функционал все еще ограничен. Вы не сможете писать код, который совмещает использование оператора ? для Option и Result в одной функции, например. Это будет возможно в будущем и уже доступно в 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 для разыменовывания.

Улучшены бектрейсы на MacOS.

Теперь вы можете создавать compile-fail тесты в Rustdoc:

/// ```compile_fail
/// let x = 5;
/// x += 2; // shouldn't compile!
/// ``

Заметьте, что данные тесты могут опасны, потому что теперь код, который не компилировался, будет компилироваться. Например, оператор ?: код с ним не будет компилироваться в 1.21, но успешно скомпилируется на 1.22 и, возможно, сломает ваши тесты.

Также, мы перестаем поддерживать le32-unknown-nacl. Google уже отказались от поддержки PNaCl, направив силы на поддержку WebAssembly.

Стабилизация библиотеки

Несколько новых API были стабилизированы:

И другие.

Cargo

Если у вас есть какие-либо примеры для пользователей, то теперь Cargo может собирать их в поддиректории в examples, которая содержит main.rs.

Теперь Cargo может использовать git репозитории для получения зависимостей.

>>> Полный патчноут

©  Linux.org.ru