Спустя месяц после выхода Rust 1.58.1 разработчики выпускают новую версию — 1.59.0. В ней они поработали над производительностью и новой функциональностью. Рассмотрим главные изменения.
Встроенный ассемблер. Rust теперь поддерживает ассемблер прямо в коде. Это позволит многим приложениям контролировать их выполнение на низком уровне или получать доступ к специализированным машинным инструкциям.
Например, код для систем на архитектуре x86-64 может выглядеть так:
use std::arch::asm;
// Умножаем х на 6 с помощью сдвигов и сложений
let mut x: u64 = 4;
unsafe {
asm!(
"mov {tmp}, {x}",
"shl {tmp}, 1",
"shl {x}, 2",
"add {x}, {tmp}",
x = inout(reg) x,
tmp = out(reg) _,
);
}
assert_eq!(x, 4 * 6);
Пока Rust поддерживает ассемблер для следующих архитектур:
- x86 и x86-64
- ARM
- AArch64
- RISC-V
Деструктурированное присваивание. Кортежи, срезы и шаблоны структур теперь можно использовать как левую часть присваивания. Это сделает присваивание более согласованным со связкой let. Разработчики отмечают, что деструктурирование с такими операторами, как +=, не работает.
let (a, b, c, d, e);
(a, b) = (1, 2);
[c, .., d, _] = [1, 2, 3, 4, 5];
Struct { e, .. } = Struct { e: 5, f: 3 };
assert_eq!([1, 2, 3, 4, 5], [a, b, c, d, e]);
Константные дефолтные и чередующиеся дженерики. Теперь можно указывать дефолтные значения для констант дженерик-типов. Например, так:
struct ArrayStorage<T, const N: usize = 2> {
arr: [T; N],
}
impl<T> ArrayStorage<T> {
fn new(a: T, b: T) -> ArrayStorage<T> {
ArrayStorage {
arr: [a, b],
}
}
}
Ранее типы параметров должны были идти перед всеми константными параметрами. Это ограничение было упрощено, чтобы позволить пользователям чередовать их.
fn cartesian_product<
T, const N: usize,
U, const M: usize,
V, F
>(a: [T; N], b: [U; M], f: F) -> [[V; N]; M]
where
F: FnMut(&T, &U) -> V
{
// ...
}
Что ещё? Разработчики предупредили о будущих сообщениях о несовместимости, сделали бинарные файлы меньше, отключили инкрементальную компиляцию по умолчанию и стабилизировали некоторые API.
Подробнее изучить все обновления можно на странице блога Rust.