Команда 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, для обновления достаточно выполнить:


$ 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> стабилизировано. Теперь такой код соберется:


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. Например:


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 теперь работает для примитивных типов, что проще показать на примере:


let mut x = 2;
let y = &8;

// раньше это не работало:
x += y;

Раньше вам бы пришлось написать x += *y чтобы разыменовать ссылку.


В MacOS улучшены бэктрейсы.


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


/// ```compile_fail
/// let x = 5;
/// x += 2; // не должно собираться!
/// ```

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


Наконец, мы убрали поддержку цели le32-unknown-nacl. Google сам объявил PNaCl устаревшим, чтобы направить все силы на поддержку WebAssembly. Вы уже сейчас можете собрать Rust код в WebAssembly и вы можете ожидать новостей о развитии его поддержи в новых выпусках Rust.


Подробности смотрите в примечаниях к выпуску.


Стабилизации стандартной библиотеки


В этом выпуске было стабилизировано несколько новых API:



Подробности смотрите в примечаниях к выпуску.


Функциональность Cargo


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


Теперь у Cargo есть возможность локальной подмены (vendoring) git репозиториев.


Подробности смотрите в примечаниях к выпуску.


Разработчики 1.22.0 и 1.22.1


Множество людей участвовало в разработке Rust 1.22. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо!снова Спасибо!)


Авторы перевода: @BORN2LOSE и ozkriff. Спасибо vitvakatu за помощь в переводе

Комментарии (5)


  1. DarkEld3r
    24.11.2017 12:35
    +1

    Очень интересно (но не настолько чтобы рыться в обсуждениях) насчёт static/cost Drop: как оно работать будет?


    1. splav_asv
      24.11.2017 14:38

      Если коротко из RFC:
      Allow types with destructors to be used in static items and in const functions, as long as the destructor never needs to run in const context.

      • Lift the restriction on types with destructors being used in statics.
      • statics containing Drop-types will not run the destructor upon program/thread exit.
      • (Optionally adding a lint that warn about the possibility of resource leak)
      • Alloc instantiating structures with destructors in constant expressions,
      • Continue to prevent const items from holding types with destructors.
      • Allow const fn to return types with destructors.
      • Disallow constant expressions which would result in the destructor being called (if the code were run at runtime).


      1. splav_asv
        24.11.2017 14:39

        В общем, lazy_static пора на покой наконец.


      1. DarkEld3r
        24.11.2017 16:45
        +1

        Спасибо, стало понятнее. Собственно, понятно всё, кроме последнего пункта:


        Disallow constant expressions which would result in the destructor being called (if the code were run at runtime).

        Может есть пример?


        1. splav_asv
          24.11.2017 23:19

          Думаю речь про это:

          const fn sample(_v: Vec<u8>) -> usize {
          	0	// Discards the input vector, dropping it
          }

          Т.е. если бы при обычном вызове в runtime в процессе вычисления выражения вызвался бы деструктор, то такое выражение не может быть const.