Команда 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
Беззнаковые {integer}::div_ceil
Беззнаковые {integer}::next_multiple_of
Беззнаковые {integer}::checked_next_multiple_of
std::ffi::FromBytesUntilNulError
std::os::unix::fs::chown
std::os::unix::fs::fchown
std::os::unix::fs::lchown
LocalKey::<Cell<T>>::get
LocalKey::<Cell<T>>::set
LocalKey::<Cell<T>>::take
LocalKey::<Cell<T>>::replace
LocalKey::<RefCell<T>>::with_borrow
LocalKey::<RefCell<T>>::with_borrow_mut
LocalKey::<RefCell<T>>::set
LocalKey::<RefCell<T>>::take
LocalKey::<RefCell<T>>::replace
Следующие API теперь возможно использовать в контексте const
:
Прочие изменения
Проверьте всё, что изменилось в Rust, Cargo и Clippy.
Участники 1.73.0
Многие люди собрались вместе, чтобы создать Rust 1.73.0. Без вас мы бы не справились. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Данную статью совместными усилиями перевели TelegaOvoshey и funkill.