- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада представить выпуск Rust 1.17.0. Rust — это системный язык
программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.
Если у вас установлена предыдущая версия Rust, то для обновления достаточно выполнить:
$ rustup update stable
Если у вас ещё не установлен Rust, то вы можете установить rustup
[1] c
соответствующей страницы нашего веб-сайта и ознакомиться с подробным примечанием
к выпуску 1.17.0 на GitHub.
Выпуск Rust 1.17.0 в основном вносит небольшие улучшения, преимущественно касающиеся удобства использования.
Например, время жизни 'static
теперь автоматически подразумевается для констант или статических переменных [2]. При создании константы или статической переменной:
const NAME: &'static str = "Ferris";
static NAME: &'static str = "Ferris";
Rust 1.17 позволит вам больше не писать 'static
, так как это единственное время жизни, которое имеет смысл:
const NAME: &str = "Ferris";
static NAME: &str = "Ferris";
В некоторых ситуациях это позволит избавиться от лишних повторений:
// было
const NAMES: &'static [&'static str; 2] = &["Ferris", "Bors"];
// стало
const NAMES: &[&str; 2] = &["Ferris", "Bors"];
Другим подобным косметическим улучшением является "короткая инициализация полей". Подобно ECMAScript 6, который называет это "Сокращение Значения Свойства Объектного Литерала" ("Object Literal Property Value Shorthand"), дублирование может быть удалено при объявлении структур, к примеру:
// определение
struct Point {
x: i32,
y: i32,
}
let x = 5;
let y = 6;
// было
let p = Point {
x: x,
y: y,
};
// стало
let p = Point {
x,
y,
};
То есть форма записи x, y
будет предполагать, что значения x
и y
соответствуют переменным с аналогичными именами, находящимися в данной области видимости.
Другое маленькое, но полезное улучшение касается в основном новичков в Rust, которые пытаются использовать +
, чтобы соединить две &str
вместе. Но это не работает, соединить вы можете лишь String + &str
. Поэтому, было добавлено новое сообщение об ошибке [3], чтобы помочь пользователям, которые совершают подобную ошибку:
// код
"foo" + "bar"
// было
error[E0369]: binary operation `+` cannot be applied to type `&'static str`
--> <anon>:2:5
|
2 | "foo" + "bar"
| ^^^^^
|
note: an implementation of `std::ops::Add` might be missing for `&'static str`
--> <anon>:2:5
|
2 | "foo" + "bar"
| ^^^^^
// стало
error[E0369]: binary operation `+` cannot be applied to type `&'static str`
--> <anon>:2:5
|
2 | "foo" + "bar"
| ^^^^^
|
= note: `+` can't be used to concatenate two `&str` strings
help: to_owned() can be used to create an owned `String` from a string
reference. String concatenation appends the string on the right to the string on
the left and may require reallocation. This requires ownership of the string on
the left.
| "foo".to_owned() + "bar"
При использовании сценариев сборки Cargo вы должны указать расположение скрипта в вашем Cargo.toml
. Однако, подавляющее большинство людей писали build = "build.rs"
, тем самым используя файл build.rs
, расположенный в корне проекта. Теперь это соглашение поддерживается самим Cargo [4], и будет использовано по умолчанию, если существует файл build.rs
. Мы предупреждали об этом изменении в течение нескольких последних выпусков. Вы также можете использовать build = false
для отказа от этого соглашения.
В этом выпуске удалена [5] старая система сборки на основе Makefile
. Новая система, анонсированная в Rust 1.15, написана на Rust и в основном использует Cargo для управления сборкой. На данный момент она уже достаточно зрелая, чтобы быть единственной системой сборки.
В рамках этого изменения, пакеты из crates.io теперь можно использовать в системе сборки Rust. Первым был добавлен mdBook [6], и он теперь используется [7] при сборки нашей разнообразной книжной документации:
Обратите внимание на ссылки на соответствующие репозитории; документы были перемещены из основного дерева. Кроме того, мы добавили четвертую книгу, которая все еще расположена в основном дереве: Книга "Нестабильные возможности Rust" [14]. Она описывает нестабильные возможности, содержит ссылки на задачи, связанные с их стабилизацией, и может содержать исходную документацию. Если есть возможность, которую вы хотите увидеть стабилизированной, то пожалуйста, примите участие в ее обсуждении!
Несколько выпусков назад rustup
перестал по умолчанию устанавливать документацию. Мы внесли это изменение, чтобы немного разгрузить канал, а также потому, что не все пользователи в действительности хотят хранить локальную копию документации. Однако это создало ловушку: некоторые пользователи не были в курсе, что произошло изменение, и заметили бы это, только если бы у них пропало подключение к Интернету. Кроме того, некоторые пользователи хотели иметь локальную копию документации, независимо от их подключения. Таким образом, мы откатили данное изменение [15], и документация снова устанавливается по умолчанию.
Наконец, хотя этот выпуск и полон улучшений, но есть один маленький шажок назад, о котором мы хотим сообщить вам с сожалением. В Windows была выпущена Visual Studio 2017, и Microsoft изменила структуру установки программного обеспечения. Rust не может автоматически определить её местоположение [16], и хотя мы работали над необходимыми изменениями, но не успели к этому выпуску. До тех пор, Visual Studio 2015 все еще работает нормально, или же вы можете запустить vcvars.bat
в командной строке. Мы надеемся, что эта работа будет выполнена в кратчайшие сроки.
Подробнее смотрите примечания к выпуску [17].
Был стабилизирован 21 новый интерфейс:
Arc::into_raw
[18] и Rc::into_raw
[19] позволят вам забрать Arc
или Rc
и получить сырой указатель.Arc::from_raw
[20] и Rc::from_raw
[21] позволят вам забрать сырой указатель и получить Arc
или Rc
.Arc::ptr_eq
[22] и Rc::ptr_eq
[23] возвращает true
если оба Arc
или оба Rc
указывают на одно и то же значение (не обязательно значения, которые сравниваются, равны).Ordering::then
[24] позволит вам сцепить два Ordering
вместе, и Ordering::then_with
[25] позволит сделать это с помощью функции.BTreeMap::range
[26] позволит вам итерировать лишь по части BTreeMap
, и BTreeMap::range_mut
[27] позволит вам сделать это с возможностью изменения. collections::Bound
[28] может дать вам еще больше контроля.process::abort
[29] будет полностью завершать процесс анормальным образом.ptr::read_unaligned
[30] и ptr::write_unaligned
[31] аналогичны ptr::read
и ptr::write
, но без требований к выравниванию.Result::expect_err
[32] зеркально подобен Result::expect
, то есть работает с вариантом Err
, а не с вариантом Ok
.Cell::swap
[33] аналогичен std::mem::swap
, но позволяет вам делать это с &Cell
вместо &mut T
.Cell::replace
[34] аналогичен std::mem::replace
, но позволяет вам делать это с &Cell
вместо &mut T
.Cell::into_inner
[35] позволит вам взять Cell
, и извлечь его значение.Cell::take
[36] позволит вам забрать значение Cell
наружу, заменив его на Default::default
.Что касается других изменений, для многих методов Cell<T>
требовалось ограничение T: Copy
, но теперь это требование значительно ослаблено [37].
Box<T>
теперь реализует [38] более дюжины новых преобразований с помощью From
.
SocketAddr
и IpAddr
также теперь имеют несколько новых преобразований [39]. Раньше вы должны были писать код вроде этого:
"127.0.0.1:3000".parse().unwrap()
Сейчас же вы можете писать
SocketAddr::from(([127, 0, 0, 1], 3000))
// или
([127, 0, 0, 1], 3000).into())
Что позволит удалить ненужный парсинг во время выполнения. Оба варианта примерно одинаково удобно читаются, все зависит от ваших предпочтений.
Обратная трассировка теперь имеет более приятное форматирование [40], опуская некоторые незначительные делали по умолчанию. Например, полная обратная трассировка:
thread 'main' panicked at 'explicit panic', foo.rs:2
stack backtrace:
1: 0x55c39a23372c - std::sys::imp::backtrace::tracing::imp::write::hf33ae72d0baa11ed
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:42
2: 0x55c39a23571e - std::panicking::default_hook::{{closure}}::h59672b733cc6a455
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panicking.rs:351
3: 0x55c39a235324 - std::panicking::default_hook::h1670459d2f3f8843
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panicking.rs:367
4: 0x55c39a235afb - std::panicking::rust_panic_with_hook::hcf0ddb069e7beee7
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panicking.rs:555
5: 0x55c39a22e866 - std::panicking::begin_panic::heb433e9aa28a7408
6: 0x55c39a22e9bf - foo::main::hd216d4a160fcce19
7: 0x55c39a23d44a - __rust_maybe_catch_panic
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libpanic_unwind/lib.rs:98
8: 0x55c39a236006 - std::rt::lang_start::hd7c880a37a646e81
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panicking.rs:436
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/panic.rs:361
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libstd/rt.rs:57
9: 0x55c39a22e9e9 - main
10: 0x7f5e5ed3382f - __libc_start_main
11: 0x55c39a22e6b8 - _start
12: 0x0 - <unknown>
теперь имеет вид
thread 'main' panicked at 'explicit panic', foo.rs:2
stack backtrace:
0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace
at /checkout/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
1: std::sys_common::backtrace::_print
at /checkout/src/libstd/sys_common/backtrace.rs:71
2: std::panicking::default_hook::{{closure}}
at /checkout/src/libstd/sys_common/backtrace.rs:60
at /checkout/src/libstd/panicking.rs:355
3: std::panicking::default_hook
at /checkout/src/libstd/panicking.rs:371
4: std::panicking::rust_panic_with_hook
at /checkout/src/libstd/panicking.rs:549
5: std::panicking::begin_panic
6: foo::main
7: __rust_maybe_catch_panic
at /checkout/src/libpanic_unwind/lib.rs:98
8: std::rt::lang_start
at /checkout/src/libstd/panicking.rs:433
at /checkout/src/libstd/panic.rs:361
at /checkout/src/libstd/rt.rs:57
9: main
10: __libc_start_main
11: _start
по умолчанию. Вы можете установить переменную окружения RUST_BACKTRACE = full
, чтобы получить полную обратную трассировку. В будущем мы планируем убрать еще больше лишней информации; См. эту ошибку [41].
Подробнее смотрите примечания к выпуску [17].
Помимо ранее упомянутых изменений, касающихся build.rs
, у Cargo есть еще несколько новых улучшений. cargo check --all
[42] и cargo run --package
[43] — два отсутствовавших до этого момента флага, которые теперь поддерживаются.
Теперь вы можете игнорировать проверки отзыва SSL [44]. Конечно, по умолчанию проверка все еще производится.
Новое поле в Cargo.toml
, required-features
, позволяет указать конкретные возможности, которые должны быть установлены для цели, которую нужно собрать [45]. Вот пример: предположим, что мы пишем контейнер, который взаимодействует с базами данных, и хотим, чтобы он поддерживал несколько баз данных. Мы могли бы это сделать в нашем Cargo.toml
:
[features]
# ...
postgres = []
sqlite = []
tools = []
Возможность tools
позволяет нам включить дополнительные инструменты, а возможности postgres
и sqlite
указывают, какие базы данных мы хотим поддерживать.
Раньше cargo build
пыталась собрать все цели, которые вам нужны. Но что, если у нас есть файл src/bin/postgres-tool.rs
, который является нужным только при условии, что возможности postgres
и tools
были включены? Раньше нам приходилось писать что-то вроде этого:
#[cfg(not(all(feature = "postgres", feature = "tools")))]
fn main() {
println!("This tool requires the `postgres` and `tools` features to be enabled.");
}
#[cfg(all(feature = "postgres", feature = "tools"))]
fn main() {
// код
}
Слишком много шаблонного кода для работы с cargo build
. Еще печальнее дело обстояло с examples/
, которые должны демонстрировать, как использовать вашу библиотеку. Но такие махинации возможны только при работе внутри самого пакета, поэтому вы потерпите неудачу, если попытаетесь использовать пример вне этого пакета.
С помощью нового ключа required-features
мы можем добавить следующее:
[[bin]]
# ...
required-features = ["postgres", "tools"]
Теперь cargo build
будет собирать наш postgres-tool
, только если у нас включены две эти возможности, и поэтому мы можем написать нормальный fn main
без всяких нагромождений вроде cfg
.
Подробнее смотрите примечания к выпуску [17].
Много людей внесли свой вклад в создание Rust 1.17. Мы не смогли бы сделать это без всех вас. Спасибо! [46]
Автор перевода: @kgv [47].
Благодарю vitvakatu [48] за помощь при переводе.
Если вы заинтересовались Rust и у вас есть вопросы, присоединяйтесь [49]!
Автор: Андрей Лесников
Источник [50]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/254189
Ссылки в тексте:
[1] установить rustup
: https://www.rust-lang.org/ru-RU/install.html
[2] время жизни 'static
теперь автоматически подразумевается для констант или статических переменных: https://github.com/rust-lang/rust/pull/39265
[3] новое сообщение об ошибке: https://github.com/rust-lang/rust/pull/39116
[4] Теперь это соглашение поддерживается самим Cargo: https://github.com/rust-lang/cargo/pull/3664
[5] удалена: https://github.com/rust-lang/rust/pull/39431
[6] mdBook: https://crates.io/crates/mdbook
[7] он теперь используется: https://github.com/rust-lang/rust/pull/39633
[8] Книга "Язык программирования Rust": https://doc.rust-lang.org/stable/book/
[9] репозиторий: https://github.com/rust-lang/book
[10] Книга "Справка по Rust": https://doc.rust-lang.org/stable/reference/
[11] репозиторий: https://github.com/rust-lang-nursery/reference
[12] Книга "Растономикон": https://doc.rust-lang.org/stable/nomicon/
[13] репозиторий: https://github.com/rust-lang-nursery/nomicon
[14] Книга "Нестабильные возможности Rust": https://doc.rust-lang.org/stable/unstable-book/
[15] откатили данное изменение: https://github.com/rust-lang/rust/pull/40526
[16] Rust не может автоматически определить её местоположение: https://github.com/rust-lang/rust/issues/38584
[17] примечания к выпуску: https://github.com/rust-lang/rust/blob/rust-1.17-relnotes/RELEASES.md#version-1170-2017-04-27
[18] Arc::into_raw
: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.into_raw
[19] Rc::into_raw
: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.into_raw
[20] Arc::from_raw
: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.from_raw
[21] Rc::from_raw
: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.from_raw
[22] Arc::ptr_eq
: https://doc.rust-lang.org/std/sync/struct.Arc.html#method.ptr_eq
[23] Rc::ptr_eq
: https://doc.rust-lang.org/std/rc/struct.Rc.html#method.ptr_eq
[24] Ordering::then
: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then
[25] Ordering::then_with
: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.then_with
[26] BTreeMap::range
: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range
[27] BTreeMap::range_mut
: https://doc.rust-lang.org/std/collections/btree_map/struct.BTreeMap.html#method.range_mut
[28] collections::Bound
: https://doc.rust-lang.org/std/collections/enum.Bound.html
[29] process::abort
: https://doc.rust-lang.org/std/process/fn.abort.html
[30] ptr::read_unaligned
: https://doc.rust-lang.org/std/ptr/fn.read_unaligned.html
[31] ptr::write_unaligned
: https://doc.rust-lang.org/std/ptr/fn.write_unaligned.html
[32] Result::expect_err
: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err
[33] Cell::swap
: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.swap
[34] Cell::replace
: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.replace
[35] Cell::into_inner
: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.into_inner
[36] Cell::take
: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.take
[37] теперь это требование значительно ослаблено: https://github.com/rust-lang/rust/pull/39793
[38] теперь реализует: https://github.com/rust-lang/rust/pull/40009
[39] несколько новых преобразований: https://github.com/rust-lang/rust/pull/39372
[40] теперь имеет более приятное форматирование: https://github.com/rust-lang/rust/pull/38165
[41] эту ошибку: https://github.com/rust-lang/rust/pull/40264
[42] cargo check --all
: https://github.com/rust-lang/cargo/pull/3731
[43] cargo run --package
: https://github.com/rust-lang/cargo/pull/3691
[44] игнорировать проверки отзыва SSL: https://github.com/rust-lang/cargo/pull/3699
[45] указать конкретные возможности, которые должны быть установлены для цели, которую нужно собрать: https://github.com/rust-lang/cargo/pull/3667
[46] Спасибо!: https://thanks.rust-lang.org/rust/1.17.0
[47] @kgv: https://github.com/kgv
[48] vitvakatu: https://habrahabr.ru/users/vitvakatu/
[49] присоединяйтесь: https://gitter.im/ruRust/general
[50] Источник: https://habrahabr.ru/post/327708/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.