Rust 1.46.0: track_caller и улучшения const fn

Original author: The Rust Core Team
  • Translation

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


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


rustup update stable

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


Что вошло в стабильную версию 1.46.0


Этот выпуск достаточно небольшой, с улучшениями в const fn, стабилизацией двух новых API в стандартной библиотеке и одной опции, удобной для авторов библиотек. Смотрите подробные примечания к выпуску чтобы узнать о других изменениях, не представленных в данном анонсе.


#[track_caller]


Вернёмся в март, когда был выпущен Rust 1.42, в котором улучшились сообщения об ошибках, когда unwrap и подобные функции приводили к панике. Тогда мы упоминали, что реализация ещё не стабильна. В Rust 1.46 мы её стабилизировали.


Этот атрибут зовётся #[track_caller] и был предложен в RFC 2091 аж в июле 2017! Если вы пишете функцию, подобную unwrap, которая может приводить к панике, вы можете добавить эту аннотацию к вашей функции, и модуль форматирования паники по умолчанию будет использовать её для отображения сообщения об ошибке. Например, unwrap:


pub fn unwrap(self) -> T {
    match self {
        Some(val) => val,
        None => panic!("вызван `Option::unwrap()` на значении `None`"),
    }
}

Теперь будет выглядеть так:


#[track_caller]
pub fn unwrap(self) -> T {
    match self {
        Some(val) => val,
        None => panic!("вызван `Option::unwrap()` на значении `None`"),
    }
}

Вот и всё!


Если вы сами реализуете ловушку паники, вы можете использовать метод вызывающей стороны в std::panic::Location, чтобы получить доступ к этой информации.


Улучшения const fn


Теперь вы также можете использовать в const fn некоторые базовые языковые вещи, такие как:


  • if, if let и match
  • while, while let и loop
  • операторы && и ||

А также преобразование в срез:


const fn foo() {
  let x = [1, 2, 3, 4, 5];

  // преобразовываем массив в срез
  let y: &[_] = &x;
}

Хотя эти функции могут не казаться вам новыми, учитывая, что вы можете использовать их все помимо const fn, они добавляют много вычислительной мощности во время компиляции! Как, например, библиотека const-sha1 может позволить вам вычислить хэши SHA1 во время компиляции. Это привело к 40-кратному повышению производительности в Microsoft WinRT для Rust.


Изменения в библиотеке


На волне улучшений в const fn, std::mem::forget теперь тоже const fn. Дополнительно в этом выпуске были стабилизированы два новых API:



Для получения более детальной информации, смотрите подробные примечания к выпуску.


Другие изменения


Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.


Участники 1.46.0


Множество людей собрались вместе, чтобы создать Rust 1.46.0. Мы не смогли бы сделать это без всех вас. Спасибо!


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


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


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

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 2

    +3

    Раз тут так тихо, то хоть похвастаюсь, что моя инициатива по ежемесячникам о ржавом игрострое — https://rust-gamedev.github.io — продержалась уже аж целый год, юху!


    В процессе перешли к более открытому процессу написания с полу-ручной координацией через гитхаб задачи: приглашаю сочувствующих присоединяться к написанию/вычитке 13ого выпуска. :)

      +1

      Не упоминается в посте, но новый синтаксис индексирования вложенных кортежей порадовал меня 't.0.0'. Намного удобнее относительно предыдущего варианта '(t.0).0'


      Не помню как реагировал на это rustfmt, но также можно записать так 't.0 .0'

      Only users with full accounts can post comments. Log in, please.