Команда Rust рада сообщить о новой версии Rust: 1.25.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.

Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:

$ rustup update stable

Если же у вас еще не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.25.0 можно ознакомиться на GitHub.

Что вошло в стабильную версию 1.25.0

Несколько последних выпусков были незначительными, но Rust 1.25 содержит много

нововведений! Во-первых: мы обновили LLVM с 4-ой версии до 6-ой. Обновление

влечёт ряд изменений, наиболее важное из которых — поддержка AVR.

Появился новый способ использовать оператор use : вложенные группы. Если вы импортировали таким способом:

use std::fs::File; use std::io::Read; use std::path::{Path, PathBuf};

То теперь можете написать так:

// на одной строке use std::{fs::File, io::Read, path::{Path, PathBuf}}; // в несколько строк use std::{ fs::File, io::Read, path::{ Path, PathBuf } };

Это может сократить повторения и сделать код более понятным.

В этом выпуске мы представили два больших изменения в документации. Во-первых: Rust By Example теперь находится на doc.rust-lang.org! В скором времени мы сделаем перенаправление со старого домена. Мы надеемся, что это привлечёт больше внимания к прекрасному ресурсу и вы получите локальную копию с вашей локальной документацией.

Во-вторых, в Rust 1.23 мы говорили о переходе от Hoedown к pulldown-cmark. В Rust 1.25, pulldown-cmark теперь по умолчанию. Напоследок, мы удалили последнюю часть кода Си из rustdoc и теперь следуем спецификации CommonMark.

В заключение, в RFC 1358, был принят атрибут #[repr(align(x))] . В Rust 1.25 он был стабилизирован! Данный атрибут позволяет установить выравнивание ваших структур:

struct Number(i32); assert_eq!(std::mem::align_of::<Number>(), 4); assert_eq!(std::mem::size_of::<Number>(), 4); #[repr(align(16))] struct Align16(i32); assert_eq!(std::mem::align_of::<Align16>(), 16); assert_eq!(std::mem::size_of::<Align16>(), 16);

Если вы работаете с низкоуровневым кодом, то контроль над такими "вещами" может быть очень важным!

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

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

Самым крупным изменением в библиотеках является std::ptr::NonNull<T> . Этот тип схож с *mut T , но он ненулевой и ковариантный. Данный блог-пост не лучшее место, чтобы объяснить различия, но в двух словах: NonNull<T> гарантирует, что он не будет равен null. Это означает, что Option<NonNull<T>> имеет такой же размер, как и *mut T . Если вы создаете структуру данных с небезопасным кодом, NonNull<T> зачастую будет правильным выбором для вас!

libcore получила модуль time , который содержит тип Duration , доступный ранее только в libstd .

Кроме того, функции from_secs и from_millis связанные с Duration , были написаны с помощью const fn , что позволяет использовать их для инициализации Duration , в константных выражениях.

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

Изменения Cargo

В интерфейсе командной строки Cargo есть одно важное изменение: cargo new теперь по умолчанию будет генерировать исполняемый файл вместо библиотеки. Мы стараемся, чтобы интерфейс Cargo был достаточно стабильным, но это важное изменение и вряд ли оно сломает пакетный менеджер.

Для справки, cargo new теперь принимает два флага: --lib для создания библиотек и --bin для создания двоичных или исполняемых файлов. В предыдущей версии Cargo, если вы не передаёте ни одного значения, то флагом по умолчанию является --lib . Мы приняли такое решение, потому что каждый бинарный файл (часто) зависит от многих библиотек и поэтому они (библиотеки) более распространенны. Однако, это не верно. Каждая библиотека использует множество бинарных файлов. Более того, при создании нового проекта, вы часто хотите, чтобы это была программа, которую можно запустить. Эта проблема возникает не только у новичков, но даже очень давние члены сообщества сказали, что они нашли это поведение неожиданным. Таким образом, мы меняем его.

Аналогично, предыдущая версия команды cargo new была немного упрямой в названии пакетов. В частности, если название вашего пакета начиналось на rust- или заканчивалось на -rs , Cargo переименовал бы его. Намерение было таковым, что это пакет языка Rust, а это является избыточной информацией. Тем не менее, люди сильно заботятся об наименовании и при столкновении с этим, они удивляются и часто расстраиваются. Поэтому, мы больше не будем этого делать.

Многие пользователи любят команду cargo doc — это способ сгенерировать документацию локально для их проекта. В этом выпуске она получила прирост скорости, потому что теперь работает через cargo check , а не cargo build . Поэтому, некоторые сценарии будут выполняться быстрее.

К тому же, выкачивание git зависимостей должно быть быстрее, благодаря использованию жёстких ссылок, когда это возможно.

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

Разработчики 1.25.0

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

Спасибо!

Автор перевода: @BORN2LOSE