- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада сообщить о выпуске новой версии, 1.47.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup
, то для обновления до версии 1.47.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его [1] с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub [2].
Данный выпуск не содержит новых языковых особенностей, хотя он добавляет одну долгожданную функцию стандартной библиотеки. По большей части, в этом выпуске повышается качество жизни, добавляются константные функции и стабилизируется стандартная библиотека, а также улучшается инструментарий. Смотрите подробные примечания к выпуску [2], чтобы узнать о других изменениях, не представленных в данном анонсе.
Rust всё ещё не поддерживает обобщения для целочисленных значений. Это давно вызывает проблемы с массивами, так как они имеют целочисленную часть в своём типе. [T; N]
представляет массив длины N
со значениями типа T
. Поскольку нет способа сделать его обобщённым по N
, типажи для массивов приходится реализовывать вручную для каждого нужного вам N
. Для стандартной библиотеки было решено поддерживать N
до 32.
Мы работали над особенностью, называемой "const generics" ("константные обобщения"), которая позволяет вам обобщать по N
. Полное описание константных обобщений выходит за рамки данного анонса, так как они ещё до конца не стабилизированы. Однако, основная их часть реализована в компиляторе и было принято решение, что константные обобщения достаточно готовы, чтобы использовать их в стандартной библиотеке для массивов любой длины [3]. На практике это означает, что если вы попытаетесь сделать нечто подобное в 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
добавлял при панике [4]. В них есть несколько вещей, которые большую часть времени бесполезны. Однако, в некоторых случаях они регрессировали [5]. В Rust 1.47 виновник нашёлся и был исправлен [6]. С момента регресса эта программа:
fn main() {
panic!();
}
давала подобную трассировку:
thread 'main' panicked at 'explicit panic', src/main.rs:2:5
stack 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:5
stack 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 [7]. Компилятор по-прежнему может собираться с версиями LLVM до 8, но по умолчанию использует 11 версию.
rustc
теперь поддерживает [8] -C control-flow-guard
, опцию, которая включает Control Flow Guard [9] на Windows. Для других платформ этот флаг игнорируется.
Дополнительно в этом выпуске были стабилизированы девять новых API:
Ident::new_raw
[10]Range::is_empty
[11]RangeInclusive::is_empty
[12]Result::as_deref
[13]Result::as_deref_mut
[14]Vec::leak
[15]pointer::offset_from
[16]f32::TAU
[17]f64::TAU
[18]Следующие, ранее стабилизированные API, стали const
:
Метод new
для всех NonZero
целых чисел. [19]Методы checked_add
,checked_sub
,checked_mul
,checked_neg
, checked_shl
, checked_shr
, saturating_add
, saturating_sub
и saturating_mul
для всех целых чисел. [19]Методы checked_abs
, saturating_abs
, saturating_neg
и signum
для всех знаковых целых чисел. [19]Методы 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
. [19]Для получения более детальной информации, смотрите подробные примечания к выпуску [2].
Rustdoc начал поддерживать тему Ayu [20].
Синтаксис [2], пакетный менеджер Cargo [21] и анализатор Clippy [22] также претерпели некоторые изменения.
Множество людей собрались вместе, чтобы создать Rust 1.47.0. Мы не смогли бы сделать это без всех вас. Спасибо! [23]
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате [24] или же в аналогичном чате для новичковых вопросов [25]. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков [26].
Также можете поддержать нас на opencollective: https://opencollective.com/rust-lang-ru [27].
Данную статью совместными усилиями перевели ArtemZdor [28], fan-tom [29], Gasika [30], funkill [31], blandger [32] и andreevlex [33].
Автор: RustLangRu
Источник [34]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/357743
Ссылки в тексте:
[1] установить его: https://www.rust-lang.org/tools/install
[2] подробные примечания к выпуску на GitHub: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1470-2020-10-08
[3] использовать их в стандартной библиотеке для массивов любой длины: https://github.com/rust-lang/rust/pull/74060/
[4] мы внесли некоторые изменения в трассировки, которые rustc
добавлял при панике: https://github.com/rust-lang/rust/pull/38165
[5] они регрессировали: https://github.com/rust-lang/rust/issues/47429
[6] был исправлен: https://github.com/rust-lang/rust/pull/75048
[7] обновились до LLVM 11: https://github.com/rust-lang/rust/pull/73526/
[8] теперь поддерживает: https://github.com/rust-lang/rust/pull/73893/
[9] Control Flow Guard: https://docs.microsoft.com/en-us/windows/win32/secbp/control-flow-guard
[10] Ident::new_raw
: https://doc.rust-lang.org/nightly/proc_macro/struct.Ident.html#method.new_raw
[11] Range::is_empty
: https://doc.rust-lang.org/nightly/std/ops/struct.Range.html#method.is_empty
[12] RangeInclusive::is_empty
: https://doc.rust-lang.org/nightly/std/ops/struct.RangeInclusive.html#method.is_empty
[13] Result::as_deref
: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.as_deref
[14] Result::as_deref_mut
: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.as_deref_mut
[15] Vec::leak
: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.leak
[16] pointer::offset_from
: https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.offset_from
[17] f32::TAU
: https://doc.rust-lang.org/stable/std/f32/consts/constant.TAU.html
[18] f64::TAU
: https://doc.rust-lang.org/stable/std/f64/consts/constant.TAU.html
[19] Метод new
для всех NonZero
целых чисел.: https://github.com/rust-lang/rust/pull/73858/
[20] Rustdoc начал поддерживать тему Ayu: https://github.com/rust-lang/rust/pull/71237/
[21] пакетный менеджер Cargo: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-147-2020-10-08
[22] анализатор Clippy: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-147
[23] Спасибо!: https://thanks.rust-lang.org/rust/1.47.0/
[24] русскоязычном Телеграм-чате: https://t.me/rustlang_ru
[25] чате для новичковых вопросов: https://t.me/rust_beginners_ru
[26] чат переводчиков: https://t.me/rustlang_ru_translations
[27] https://opencollective.com/rust-lang-ru: https://opencollective.com/rust-lang-ru
[28] ArtemZdor: https://habr.com/ru/users/artemzdor/
[29] fan-tom: https://habr.com/ru/users/fan-tom/
[30] Gasika: https://habr.com/ru/users/gasika/
[31] funkill: https://habr.com/ru/users/funkill/
[32] blandger: https://habr.com/ru/users/blandger/
[33] andreevlex: https://habr.com/ru/users/andreevlex/
[34] Источник: https://habr.com/ru/post/522304/?utm_source=habrahabr&utm_medium=rss&utm_campaign=522304
Нажмите здесь для печати.