Команда Rust рада сообщить о новой версии языка — 1.73.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.73.0 вам достаточно выполнить команду:


rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.


Что стабилизировано в 1.73.0


Сообщения паники стали чище


Мы изменили выходные данные, создаваемые обработчиком паники по умолчанию, чтобы поместить сообщение в отдельную строку (а не заключать в кавычки, как раньше). Это может облегчить чтение сообщений паники, как показано в этом примере:


fn main() {
    let file = "ferris.txt";
    panic!("oh no! {file:?} not found!");
}

Вывод до Rust 1.73:


thread 'main' panicked at 'oh no! "ferris.txt" not found!', src/main.rs:3:5

Вывод начиная с Rust 1.73:


thread 'main' panicked at src/main.rs:3:5:
oh no! "ferris.txt" not found!

Это особенно удобно, когда сообщение длинное, содержит вложенные кавычки или занимает несколько строк.


Дополнительно были изменены сообщения, генерируемые assert_eq и assert_ne: перемещено сообщение об ошибке (третий аргумент) и удалена ненужная пунктуация, как показано ниже:


fn main() {
    assert_eq!("????", "????", "ferris - это не рыба");
}

Вывод до Rust 1.73:


thread 'main' panicked at 'assertion failed: `(left == right)`
 left: `"????"`,
right: `"????"`: ferris - это не рыба', src/main.rs:2:5

Вывод начиная с Rust 1.73:


thread 'main' panicked at src/main.rs:2:5:
assertion `left == right` failed: ferris - это не рыба
 left: "????"
right: "????"

Инициализация локальных данных потока


Как было предложено в RFC 3184, с LocalKey<Cell<T>> и LocalKey<RefCell<T>> теперь можно управлять напрямую с помощью методов get(), set(), take() и replace(), а не прыгать в замыкание with(|inner| ...), как нужно для общей работы LocalKey. LocalKey<T> — это тип статических данных thread_local!.


Новые методы делают код более кратким и позволяют избежать запуска дополнительного кода инициализации для значения по умолчанию, указанного в thread_local! для новых потоков.


thread_local! {
    static THINGS: Cell<Vec<i32>> = Cell::new(Vec::new());
}

fn f() {
    // раньше:
    THINGS.with(|i| i.set(vec![1, 2, 3]));
    // теперь:
    THINGS.set(vec![1, 2, 3]);

    // ...

    // раньше:
    let v = THINGS.with(|i| i.take());
    // теперь:
    let v: Vec<i32> = THINGS.take();
}

Стабилизированные API



Следующие API теперь возможно использовать в контексте const:



Прочие изменения


Проверьте всё, что изменилось в Rust, Cargo и Clippy.


Участники 1.73.0


Многие люди собрались вместе, чтобы создать Rust 1.73.0. Без вас мы бы не справились. Спасибо!


От переводчиков


С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.


Данную статью совместными усилиями перевели TelegaOvoshey и funkill.

Комментарии (2)


  1. ababo
    06.10.2023 22:27
    +5

    Чего-то изменения этой версии ни о чём...


    1. dpytaylo
      06.10.2023 22:27
      +4

      Ну всё-таки не на каждую версию серьёзные изменения, выход же версий предопределен. Зато, уже не за горизонтом, виднеется стабилизация тех же async трейтов, что будет довольно масштабным событием для всей асинхронности в расте.