Команда Rust рада сообщить о выпуске новой версии, 1.47.0. Rust это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами
rustup
, то для обновления до версии 1.47.0 вам
достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете
установить его с соответствующей страницы нашего
веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Что вошло в стабильную версию 1.47.0
Данный выпуск не содержит новых языковых особенностей, хотя он добавляет одну долгожданную функцию стандартной библиотеки. По большей части, в этом выпуске повышается качество жизни, добавляются константные функции и стабилизируется стандартная библиотека, а также улучшается инструментарий. Смотрите подробные примечания к выпуску, чтобы узнать о других изменениях, не представленных в данном анонсе.
Типажи на больших массивах
Rust всё ещё не поддерживает обобщения для целочисленных
значений. Это давно вызывает проблемы с массивами, так как они
имеют целочисленную часть в своём типе. [T; N]
представляет массив длины N
со значениями типа
T
. Поскольку нет способа сделать его обобщённым по
N
, типажи для массивов приходится реализовывать
вручную для каждого нужного вам N
. Для стандартной
библиотеки было решено поддерживать N
до 32.
Мы работали над особенностью, называемой "const generics"
("константные обобщения"), которая позволяет вам обобщать по
N
. Полное описание константных обобщений выходит за
рамки данного анонса, так как они ещё до конца не стабилизированы.
Однако, основная их часть реализована в компиляторе и было принято
решение, что константные обобщения достаточно готовы, чтобы
использовать их в стандартной библиотеке для
массивов любой длины. На практике это означает, что если вы
попытаетесь сделать нечто подобное в Rust 1.46:
fn main() { let xs = [0; 34]; println!("{:?}", xs);}
то получите такую ошибку:
error[E0277]: arrays only have std trait implementations for lengths 0..=32 --> src/main.rs:4:22 |4 | println!("{:?}", xs); | ^^ the trait `std::array::LengthAtMost32` is not implemented for `[{integer}; 34]` | = note: required because of the requirements on the impl of `std::fmt::Debug` for `[{integer}; 34]` = note: required by `std::fmt::Debug::fmt` = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
Но в Rust 1.47 массив распечатается правильно.
Это должно сделать массивы более полезными, хотя придётся подождать, пока константные обобщения не стабилизируются и библиотеки смогут использовать их для своих собственных типажей. У нас пока нет предположительной даты стабилизации константных обобщений.
Более короткие трассировки
Вернёмся в Rust 1.18, где мы внесли некоторые изменения в трассировки,
которые rustc
добавлял при панике. В них есть несколько
вещей, которые большую часть времени бесполезны. Однако, в
некоторых случаях они регрессировали. В Rust 1.47 виновник нашёлся
и был исправлен. С момента регресса эта
программа:
fn main() { panic!();}
давала подобную трассировку:
thread 'main' panicked at 'explicit panic', src/main.rs:2:5stack backtrace: 0: backtrace::backtrace::libunwind::trace at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86 1: backtrace::backtrace::trace_unsynchronized at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66 2: std::sys_common::backtrace::_print_fmt at src/libstd/sys_common/backtrace.rs:78 3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt at src/libstd/sys_common/backtrace.rs:59 4: core::fmt::write at src/libcore/fmt/mod.rs:1076 5: std::io::Write::write_fmt at src/libstd/io/mod.rs:1537 6: std::sys_common::backtrace::_print at src/libstd/sys_common/backtrace.rs:62 7: std::sys_common::backtrace::print at src/libstd/sys_common/backtrace.rs:49 8: std::panicking::default_hook::{{closure}} at src/libstd/panicking.rs:198 9: std::panicking::default_hook at src/libstd/panicking.rs:217 10: std::panicking::rust_panic_with_hook at src/libstd/panicking.rs:526 11: std::panicking::begin_panic at /rustc/04488afe34512aa4c33566eb16d8c912a3ae04f9/src/libstd/panicking.rs:456 12: playground::main at src/main.rs:2 13: std::rt::lang_start::{{closure}} at /rustc/04488afe34512aa4c33566eb16d8c912a3ae04f9/src/libstd/rt.rs:67 14: std::rt::lang_start_internal::{{closure}} at src/libstd/rt.rs:52 15: std::panicking::try::do_call at src/libstd/panicking.rs:348 16: std::panicking::try at src/libstd/panicking.rs:325 17: std::panic::catch_unwind at src/libstd/panic.rs:394 18: std::rt::lang_start_internal at src/libstd/rt.rs:51 19: std::rt::lang_start at /rustc/04488afe34512aa4c33566eb16d8c912a3ae04f9/src/libstd/rt.rs:67 20: main 21: __libc_start_main 22: _start
Теперь, с Rust 1.47.0, вместо неё вы увидите следующее:
thread 'main' panicked at 'explicit panic', src/main.rs:2:5stack backtrace: 0: std::panicking::begin_panic at /rustc/d6646f64790018719caebeafd352a92adfa1d75a/library/std/src/panicking.rs:497 1: playground::main at ./src/main.rs:2 2: core::ops::function::FnOnce::call_once at /rustc/d6646f64790018719caebeafd352a92adfa1d75a/library/core/src/ops/function.rs:227
Это позволяет намного легче увидеть, где произошла паника, но вы
всё также можете установить RUST_BACKTRACE=full
, если
хотите видеть всё.
LLVM 11
Мы обновились до LLVM 11. Компилятор по-прежнему может собираться с версиями LLVM до 8, но по умолчанию использует 11 версию.
Control Flow Guard на Windows
rustc
теперь поддерживает -C
control-flow-guard
, опцию, которая включает Control Flow Guard на Windows. Для других
платформ этот флаг игнорируется.
Изменения в стандартной библиотеке
Дополнительно в этом выпуске были стабилизированы девять новых API:
Ident::new_raw
Range::is_empty
RangeInclusive::is_empty
Result::as_deref
Result::as_deref_mut
Vec::leak
pointer::offset_from
f32::TAU
f64::TAU
Следующие, ранее стабилизированные API, стали
const
:
Метод new
для всехNonZero
целых чисел.Методы checked_add
,checked_sub
,checked_mul
,checked_neg
,checked_shl
,checked_shr
,saturating_add
,saturating_sub
иsaturating_mul
для всех целых чисел.Методы checked_abs
,saturating_abs
,saturating_neg
иsignum
для всех знаковых целых чисел.Методы is_ascii_alphabetic
,is_ascii_uppercase
,is_ascii_lowercase
,is_ascii_alphanumeric
,is_ascii_digit
,is_ascii_hexdigit
,is_ascii_punctuation
,is_ascii_graphic
,is_ascii_whitespace
иis_ascii_control
дляchar
иu8
.
Для получения более детальной информации, смотрите подробные примечания к выпуску.
Другие изменения
Rustdoc начал поддерживать тему Ayu.
Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.
Участники 1.47.0
Множество людей собрались вместе, чтобы создать Rust 1.47.0. Мы не смогли бы сделать это без всех вас. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном
чате для новичковых вопросов. Если у вас есть
вопросы по переводам или хотите помогать с ними, то обращайтесь в
чат переводчиков.
Так же можете поддержать нас на opencollective: https://opencollective.com/rust-lang-ru.
Данную статью совместными усилиями перевели ArtemZdor, fan-tom, funkill, blandger и andreevlex.