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.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось8
До обраногоВ обраному1
LinkedIn
Ctrl + Enter
Ctrl + Enter

Підписатись на коментарі