Rust 1.85 та Rust 2024: головні нововведення, зміни та оновлення
Сьогодні відбувся анонс нової версії мови програмування Rust — 1.85.0, яка також знаменує стабілізацію редакції Rust 2024. Поговоримо про головне з оновлення.
Що цікавого в Rust 1.85.0
У цій версії додано підтримку асинхронних замикань у форматі async || {}. Це дозволяє створювати асинхронні замикання, які працюють аналогічно асинхронним функціям (async fn). Наприклад, ви можете визначити асинхронне замикання наступним чином:
let mut vec: Vec<String> = vec![];
let closure = async || {
vec.push(ready(String::from("")).await);
};
Також було впроваджено атрибут #[diagnostic::do_not_recommend], який дозволяє компілятору приховувати певні реалізації типажів у діагностичних повідомленнях.
Крім того, розширено підтримку типажів FromIterator та Extend для кортежів розміром до 12 елементів. Це означає, що тепер ви можете збирати і розширювати кортежі з різною кількістю елементів, використовуючи ці типажі. Наприклад:
use std::collections::{LinkedList, VecDeque};
fn main() {
let (squares, cubes, tesseracts): (Vec<_>, VecDeque<_>, LinkedList<_>) =
(0i32..10).map(|i| (i * i, i.pow(3), i.pow(4))).collect();
println!("{squares:?}");
println!("{cubes:?}");
println!("{tesseracts:?}");
}
Ключові зміни в редакції Rust 2024
Редакція Rust 2024 приносить низку важливих змін, спрямованих на покращення безпеки та читабельності коду:
- Правила захоплення часу життя RPIT — змінено поведінку за замовчуванням для захоплення параметрів у типах
impl Trait, якщо не використовуєтьсяuse<..>. - Область дії тимчасових значень у
if let— змінено область видимості тимчасових значень у виразахif let. - Область дії тимчасових значень у хвостових виразах — змінено область дії тимчасових значень у завершальних виразах блоків.
- Обмеження неоднозначних шаблонів — деякі комбінації шаблонів тепер заборонені, щоб уникнути плутанини та забезпечити можливість майбутніх покращень.
- Небезпечні
extern-блоки — теперextern-блоки обов’язково мають бути позначені ключовим словомunsafe. - Небезпечні атрибути — атрибути
export_name,link_sectionіno_mangleтепер повинні бути позначені якunsafe. - Попередження
unsafe_op_in_unsafe_fn— ця перевірка тепер активована за замовчуванням і вимагає явного використанняunsafe {}у функціяхunsafe. - Заборона посилань на
static mut— створення посилань наstatic mutтепер викликає помилку за замовчуванням. - Зміни у приведенні типу
Never— змінено поведінку примусового приведення типу!, а також встановлено рівень перевіркиnever_type_fallback_flowing_into_unsafeна «deny». - Специфікатори фрагментів макросів — специфікатор
exprу макросахmacro_rules!тепер також підтримує виразиconstта_. - Перевірка відсутніх специфікаторів фрагментів макросів — тепер це серйозна помилка, що забороняє використання макро-метазмінних без визначеного типу фрагмента.
- Зарезервоване ключове слово
gen— зарезервовано для майбутнього впровадження генераторних блоків. - Зарезервований синтаксис — зарезервовано синтаксис рядків у форматі
#"foo"#і токени##для подальших змін у парсингу літералів.
Також були внесені зміни в стандартні бібліотеки:
- Додано
FutureтаIntoFutureдоPrelude. - Реалізовано
IntoIteratorдляBox<[T]>, що змінює спосіб роботи з ітераціями для масивів у купі, дозволяючи безпосередньо ітеруватися поBox<[T]>. - Функції
std::env::set_var,std::env::remove_varтаstd::os::unix::process::CommandExt::before_execпозначено як unsafe.
Окрім цього зміни торкнулися Cargo:
- Розв’язувач залежностей, що враховує версію Rust — змінено поведінку стандартного механізму розв’язання залежностей у Cargo, тепер він враховує поле
rust-version. - Уніфікація назв таблиць і ключів — видалено деякі застарілі ключі у
Cargo.toml. - Відхилення невикористаних успадкованих
default-features— змінено логіку роботиdefault-features = falseдля залежностей, успадкованих у робочій області (workspace).
Також оновлення стосувалося й Rustdoc:
- Об’єднані тестові приклади в Rustdoc — тепер doctest збираються в один виконуваний файл, що значно підвищує продуктивність тестування.
- Зміни у вкладених include! в Rustdoc — оновлено обробку відносних шляхів для вкладених файлів, що використовують include!.
Були внесені зміни Rustfmt:
- Редакції стилів у Rustfmt — введено концепцію «редакцій стилів», що дозволяє незалежно керувати форматуванням коду від редакції Rust.
- Виправлення форматування у Rustfmt — велика кількість покращень у форматуванні для різних випадків.
- Сортування необроблених ідентифікаторів у Rustfmt — змінено спосіб сортування ідентифікаторів r#foo.
- Сортування версій у Rustfmt — оновлено алгоритм сортування ідентифікаторів, які містять числа.
Висновок
Це оновлення є однією з найбільших редакцій за всю історію Rust. В ньому взяли участь 742 розробники.
Якщо ви ще не оновили свою версію Rust, зробити це дуже просто:
$ rustup update stable
Також не забудьте переглянути офіційне керівництво з редакцій для більш детальної інформації про зміни в Rust 2024.
Немає коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів