Команда разработчиков Rust с удовольствием объявляет о выходе новой стабильной версии Rust: 1.20.0.
Rust — это язык программирования, ориентированный на безопасность, скорость и параллелизм.
Если у вас установлена предыдущая версия Rust, то для обновления до Rust 1.20 достаточно выполнить следующую команду:
rustup update stable
(Прим. пер. - иногда предварительно нужно выполнить rustup self update
)
Если Rust ещё не установлен, то вы можете установить его скачав rustup
с соответствующей страницы на нашем сайте. Также вы можете посмотреть полный список изменений в Rust 1.20.0 на GitHub.
Что нового в стабильной версии Rust 1.20.0
В предыдущих версиях Rust вы уже могли определять «ассоциированные функции» для трейтов, структур и типов-сумм:
struct Struct;
impl Struct {
fn foo() {
println!("foo - это ассоциированная функция структуры Struct");
}
}
fn main() {
Struct::foo();
}
Такие функции называются ассоциированными, так как для их вызова не требуется наличие переменной данного типа, то есть они ассоциированы с типом, а не с переменными данного типа.
В Rust 1.20 добавлена возможность использовать «ассоциированные константы»:
struct Struct;
impl Struct {
const ID: u32 = 0;
}
fn main() {
println!("ID структуры Struct: {}", Struct::ID);
}
ID
ассоциирована со структурой Struct
. Как и функции, ассоциированные константы могут быть определены для трейтов и типов-сумм.Использование ассоциированных констант в трейтах предоставляет дополнительные возможности. Ассоциированная константа в трейте используется также, как и ассоциированный тип: её можно определить, не присваивая ей значение. Значение константы будет указано при реализации трейта:
trait Trait {
const ID: u32;
}
struct Struct;
impl Trait for Struct {
const ID: u32 = 5;
}
fn main() {
println!("{}", Struct::ID);
}
trait Float {
fn nan() -> Self;
fn infinity() -> Self;
...
}
mod f32 {
const NAN: f32 = 0.0f32 / 0.0f32;
const INFINITY: f32 = 1.0f32 / 0.0f32;
impl Float for f32 {
fn nan() -> Self {
f32::NAN
}
fn infinity() -> Self {
f32::INFINITY
}
}
}
trait Float {
const NAN: Self;
const INFINITY: Self;
...
}
mod f32 {
impl Float for f32 {
const NAN: f32 = 0.0f32 / 0.0f32;
const INFINITY: f32 = 1.0f32 / 0.0f32;
}
}
Кроме того, мы исправили ошибку при работе с макросом include!
в тестах документации: пути к файлам определялись относительно рабочего каталога, а не каталога, в котором находится файл кода.
Стабилизация библиотек
В этом релизе не произошло значительных изменений в стандартных библиотеках. Внесено несколько полезных улучшений и продолжается работа по стабилизации API.
Макро unimplemented!
теперь принимает параметр, в котором можно указать причину отсутствия реализации.
Добавлена поддержка Unicode 10.0.0.
Функции min
и max
были переписаны на Rust, и больше не используют cmath
.
Внедрена защита от уязвимости Stack Clash. Основные изменения: stack probes и отключение дополнительных ручных проверок для стека основного потока. Для включения защиты достаточно скомпилировать проект в Rust 1.20, изменения в коде не требуются.
В стандартную библиотеку добавлены три новые функции сортировки: slice::sort_unstable_by_key
, slice::sort_unstable_by
и slice::sort_unstable
. Как вы заметили, все три содержат «unstable» в названиях. Стабильность — это свойство алгоритма сортировки, которое требуется не всегда, но раньше в стандартной библиотеке не было алгоритмов нестабильной сортировки. Теперь доступны обе возможности! Для демонстрации разницы между этими видами сортировки рассмотрим список:
rust
crate
package
cargo
crate
cargo
package
rust
crate
предшествовало слову cargo
, то и в отсортированном списке оно должно стоять первым. Алгоритм нестабильной сортировки тоже может выдать такой результат, но допускается и вариант с измененной последовательностью:
cargo
crate
package
rust
Также были стабилизированы следующие API:
- CStr::into_c_string
- CString::as_c_str и CString::into_boxed_c_str
- Chain::get_mut, Chain::get_ref и Chain::into_inner
- Option::get_or_insert_with, Option::get_or_insert
- OsStr::into_os_string
- OsString::into_boxed_os_str
- Take::get_mut и Take::get_ref
- Utf8Error::error_len
и некоторые другие.
Возможности cargo
Этот релиз внес полезные улучшения в менеджер пакетов cargo. Первое и самое важное: токен аутентификации для crates.io хранился в ~/.cargo/config
. Обычно маска доступа для файлов конфигурации устанавливается в 644
, то есть чтение разрешено всем. Но в этом файле хранится секретный токен. Мы переместили токен в отдельный файл ~/.cargo/credentials
, таким образом для него может быть установлен доступ 600
, и он будет скрыт от других пользователей системы.
Если вы использовали пакеты Cargo, создающие дополнительные исполняемые файлы, вы знаете, что их исходный код хранится в src/bin
. Но иногда вам может понадобиться создать несколько дополнительных исполняемых файлов, требующих много кода. В этом случае код может храниться в файлах src/bin/client.rs
и src/bin/server.rs
и все субмодули этих файлов попадут в один каталог, что неудобно и создает путаницу. Теперь мы используем соглашение, что такие файлы как src/bin/server/main.rs
и src/bin/client/main.rs
также используются для создания дополнительных исполняемых файлов. Это позволяет удобнее разграничить код.
>>> Подробности