0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
1
<p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
2
<p>Спустя месяц после выхода Rust 1.58.1 разработчики выпускают новую версию - 1.59.0. В ней они поработали над производительностью и новой функциональностью. Рассмотрим главные изменения.</p>
2
<p>Спустя месяц после выхода Rust 1.58.1 разработчики выпускают новую версию - 1.59.0. В ней они поработали над производительностью и новой функциональностью. Рассмотрим главные изменения.</p>
3
<p><strong>Встроенный ассемблер.</strong>Rust теперь поддерживает ассемблер прямо в коде. Это позволит многим приложениям контролировать их выполнение на низком уровне или получать доступ к специализированным машинным инструкциям.</p>
3
<p><strong>Встроенный ассемблер.</strong>Rust теперь поддерживает ассемблер прямо в коде. Это позволит многим приложениям контролировать их выполнение на низком уровне или получать доступ к специализированным машинным инструкциям.</p>
4
<p>Например, код для систем на архитектуре x86-64 может выглядеть так:</p>
4
<p>Например, код для систем на архитектуре x86-64 может выглядеть так:</p>
5
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);<p>Пока Rust поддерживает ассемблер для следующих архитектур:</p>
5
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);<p>Пока Rust поддерживает ассемблер для следующих архитектур:</p>
6
<ul><li>x86 и x86-64</li>
6
<ul><li>x86 и x86-64</li>
7
<li>ARM</li>
7
<li>ARM</li>
8
<li>AArch64</li>
8
<li>AArch64</li>
9
<li>RISC-V</li>
9
<li>RISC-V</li>
10
</ul><p><strong>Деструктурированное присваивание.</strong>Кортежи, срезы и шаблоны структур теперь можно использовать как левую часть присваивания. Это сделает присваивание более согласованным со связкой<strong>let</strong>. Разработчики отмечают, что деструктурирование с такими операторами, как<strong>+=</strong>, не работает.</p>
10
</ul><p><strong>Деструктурированное присваивание.</strong>Кортежи, срезы и шаблоны структур теперь можно использовать как левую часть присваивания. Это сделает присваивание более согласованным со связкой<strong>let</strong>. Разработчики отмечают, что деструктурирование с такими операторами, как<strong>+=</strong>, не работает.</p>
11
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]);<p><strong>Константные дефолтные и чередующиеся дженерики.</strong>Теперь можно указывать дефолтные значения для констант дженерик-типов. Например, так:</p>
11
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]);<p><strong>Константные дефолтные и чередующиеся дженерики.</strong>Теперь можно указывать дефолтные значения для констант дженерик-типов. Например, так:</p>
12
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], } } }<p>Ранее типы параметров должны были идти перед всеми константными параметрами. Это ограничение было упрощено, чтобы позволить пользователям чередовать их.</p>
12
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], } } }<p>Ранее типы параметров должны были идти перед всеми константными параметрами. Это ограничение было упрощено, чтобы позволить пользователям чередовать их.</p>
13
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 { // ... }<p><strong>Что ещё?</strong>Разработчики<a>предупредили</a>о будущих сообщениях о несовместимости,<a>сделали</a>бинарные файлы меньше,<a>отключили</a>инкрементальную компиляцию по умолчанию и <a>стабилизировали</a>некоторые API.</p>
13
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 { // ... }<p><strong>Что ещё?</strong>Разработчики<a>предупредили</a>о будущих сообщениях о несовместимости,<a>сделали</a>бинарные файлы меньше,<a>отключили</a>инкрементальную компиляцию по умолчанию и <a>стабилизировали</a>некоторые API.</p>
14
<p>Подробнее изучить все обновления можно на <a>странице блога Rust</a>.</p>
14
<p>Подробнее изучить все обновления можно на <a>странице блога Rust</a>.</p>
15
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
15
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>