LINUX.ORG.RU

Rust 1.17

 ,


3

9

Команда Rust рада представить выпуск Rust 1.17.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.

Если у вас установлена предыдущая версия Rust, то для обновления достаточно выполнить:

$ rustup update stable

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

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

Выпуск Rust 1.17.0 в основном вносит небольшие улучшения, преимущественно касающиеся удобства использования. Например, время жизни 'static теперь автоматически подразумевается для констант или статических переменных. При создании константы или статической переменной:

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. Поэтому, было добавлено новое сообщение об ошибке, чтобы помочь пользователям, которые совершают подобную ошибку:

// код
"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, и будет использовано по умолчанию, если существует файл build.rs. Мы предупреждали об этом изменении в течение нескольких последних выпусков. Вы также можете использовать build = false для отказа от этого соглашения.

В этом выпуске удалена старая система сборки на основе Makefile. Новая система, анонсированная в Rust 1.15, написана на Rust и в основном использует Cargo для управления сборкой. На данный момент она уже достаточно зрелая, чтобы быть единственной системой сборки.

В рамках этого изменения, пакеты из crates.io теперь можно использовать в системе сборки Rust. Первым был добавлен mdBook, и он теперь используется при сборки нашей разнообразной книжной документации:

Обратите внимание на ссылки на соответствующие репозитории; документы были перемещены из основного дерева. Кроме того, мы добавили четвертую книгу, которая все еще расположена в основном дереве: Книга «Нестабильные возможности Rust». Она описывает нестабильные возможности, содержит ссылки на задачи, связанные с их стабилизацией, и может содержать исходную документацию. Если есть возможность, которую вы хотите увидеть стабилизированной, то пожалуйста, примите участие в ее обсуждении!

Несколько выпусков назад rustup перестал по умолчанию устанавливать документацию. Мы внесли это изменение, чтобы немного разгрузить канал, а также потому, что не все пользователи в действительности хотят хранить локальную копию документации. Однако это создало ловушку: некоторые пользователи не были в курсе, что произошло изменение, и заметили бы это, только если бы у них пропало подключение к Интернету. Кроме того, некоторые пользователи хотели иметь локальную копию документации, независимо от их подключения. Таким образом, мы откатили данное изменение, и документация снова устанавливается по умолчанию.

Подробнее смотрите примечания к выпуску.

Стабилизация библиотек

Был стабилизирован 21 новый интерфейс:

  • Arc::into_raw и Rc::into_raw позволят вам забрать Arc или Rc и получить сырой указатель.
  • Arc::from_raw и Rc::from_raw позволят вам забрать сырой указатель и получить Arc или Rc.
  • Arc::ptr_eq и Rc::ptr_eq возвращает true если оба Arc или оба Rc указывают на одно и то же значение (не обязательно значения, которые сравниваются, равны).
  • Ordering::then позволит вам сцепить два Ordering вместе, и Ordering::then_with позволит сделать это с помощью функции.
  • BTreeMap::range позволит вам итерировать лишь по части BTreeMap, и BTreeMap::range_mut позволит вам сделать это с возможностью изменения. collections::Bound может дать вам еще больше контроля.
  • process::abort будет полностью завершать процесс анормальным образом.
  • ptr::read_unaligned и ptr::write_unaligned аналогичны ptr::read и ptr::write, но без требований к выравниванию.
  • Result::expect_err зеркально подобен Result::expect, то есть работает с вариантом Err, а не с вариантом Ok.
  • Cell::swap аналогичен std::mem::swap, но позволяет вам делать это с &Cell вместо &mut T.
  • Cell::replace аналогичен std::mem::replace, но позволяет вам делать это с &Cell вместо &mut T.
  • Cell::into_inner позволит вам взять Cell, и извлечь его значение.
  • Cell::take позволит вам забрать значение Cell наружу, заменив его на Default::default.

Что касается других изменений, для многих методов Cell<T> требовалось ограничение T: Copy, но теперь это требование значительно ослаблено.

Box<T> теперь реализует более дюжины новых преобразований с помощью From.

SocketAddr и IpAddr также теперь имеют несколько новых преобразований. Раньше вы должны были писать код вроде этого:

"127.0.0.1:3000".parse().unwrap()

Сейчас же вы можете писать
SocketAddr::from(([127, 0, 0, 1], 3000))
// или
([127, 0, 0, 1], 3000).into())

Что позволит удалить ненужный парсинг во время выполнения. Оба варианта примерно одинаково удобно читаются, все зависит от ваших предпочтений.

Обратная трассировка теперь имеет более приятное форматирование, опуская некоторые незначительные детали по умолчанию.

Возможности Cargo

Помимо ранее упомянутых изменений, касающихся build.rs, у Cargo есть еще несколько новых улучшений. cargo check --all и cargo run --package — два отсутствовавших до этого момента флага, которые теперь поддерживаются.

Теперь вы можете игнорировать проверки отзыва SSL. Конечно, по умолчанию проверка все еще производится.

Новое поле в Cargo.toml, required-features, позволяет указать конкретные возможности, которые должны быть установлены для цели, которую нужно собрать. Вот пример: предположим, что мы пишем контейнер, который взаимодействует с базами данных, и хотим, чтобы он поддерживал несколько баз данных. Мы могли бы это сделать в нашем 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.

Разработчики версии 1.17.0

Много людей внесли свой вклад в создание Rust 1.17. Мы не смогли бы сделать это без всех вас. Спасибо!

Авторы перевода и публикации @kgv, @vitvakatu, @ozkriff.

>>> Подробнее смотрите примечания к выпуску

★★★★★

Проверено: Shaman007 ()
Последнее исправление: sudopacman (всего исправлений: 3)

Ответ на: комментарий от anonymous

Шутка про 1%. У меня тоже есть програмка на расте, и версия для линя идёт в tar.gz. Так вот зачем мне доболтаться с deb/rpm, если у меня 70% скачиваний - винда, 25% - мак, и 5% линь.

RazrFalcon ★★★★★
()

а что там с серво? я уже могу на нем лорчик нормально серфить и ютубчик смотреть? а то как бы обещали еще год назад выдать на-гора.

anonymous
()
Ответ на: комментарий от RazrFalcon

Шутка про 1%. У меня тоже есть програмка на расте, и версия для линя идёт в tar.gz. Так вот зачем мне доболтаться с deb/rpm, если у меня 70% скачиваний - винда, 25% - мак, и 5% линь.

Надо же. Откуда нашлись эти 5% отмороженных что бы качать с неизвестного сайта? Неужели все так плохо и ubunta альтернативно одаренных людей в linux?

anonymous
()
Ответ на: комментарий от RazrFalcon

Чот не осилил найти, где его скачать и восхититься. И вообще кроме презентахи и новостей ничего. Вот серви вижу, а где этот квантум?

anonymous
()
Ответ на: комментарий от RazrFalcon

Вы, конечно, в следствии альтернативной одаренности, можете воображать себе любую вселенную с любыми правилами и историей. Однако, есть подозрения, что в объективной реальности количество mission-critical проектов на Ada в сфере embedded в разы (если не на порядки) превышает количество аналогичных проектов на Rust-е. То же самое можно сказать и о деньгах, которые вкладываются в эти разработки.

Но да, когда мозги пролюблены Qt, можно от этого отмахнуться и наклеить ярлыки «legacy». Особенно на то, чего не знаешь.

eao197 ★★★★★
()
Ответ на: комментарий от anonymous

Во-первых, не с неизвестного, а с github, а во-вторых, linux - зоопарк и поддерживать все дистры смысла нет. У меня вообще gentoo, толку мне от deb?

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Во-первых, не с неизвестного, а с github, а во-вторых, linux - зоопарк и поддерживать все дистры смысла нет. У меня вообще gentoo, толку мне от deb?

Тогда из неизвестного репозитария. Разница какая?

anonymous
()
Ответ на: комментарий от anonymous

на старой сишке из 90-х

Собранной компилятором из 2017-го, в который было вложено по меньшей мере 30 лет работы (gcc)?

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Нужно постараться, чтобы перевалить за 2МБ

это смотря что за приложение и что в нем используется. если хочется влинковать прям вообще все - 2 метра будет капля в море

upcFrost ★★★★★
()
Ответ на: комментарий от RazrFalcon

Разница в том, что не нужно равнять всех по себе. Не хотите не из репы ставить софт - не ставьте.

Так это нормальное поведение для пользователей linux, ставить софт из репозитария дистрибутива.

Если у вас нашлись 5% скачавших, то дело плохо. Будут тащить дер... с закладками в свои системы и потом вопить о вирусах.

anonymous
()
Ответ на: комментарий от RazrFalcon

У меня вообще gentoo, толку мне от deb?

а ты прям так берешь и ./configure && make && make install? или все-таки через emerge/cave? просто помни что portage/paludis - это тоже в некотором роде пакетные менеджеры.

upcFrost ★★★★★
()
Ответ на: комментарий от anonymous

Порог вхождения в линукс всё же повыше. И да, есть куча софта, которого нету в репах. Простой пример: посмотрите количество пакетов в том же aur.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

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

Вообще-то мозги включать нужно: это был тривиальнейший пример, демонстрирующий суть одной из проблем в C++. В реальности ситуации могут быть более запутанные, в которых компилятор будет молчать как рыба об лед. Только вот постить объемные примеры на LOR-е не всегда есть время и желание.

eao197 ★★★★★
()
Ответ на: комментарий от upcFrost

Я о том, что если на сайте проги висит .deb, мне от этого ни холодно, ни жарко.

А ставлю я всю через portage, конечно же. Если нужно что-то своё - никто не мешает собрать в chroot и подобном.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ну вот у меня cli прога из ~10 либ - 1.4МБ. Что туда ещё нужно линковать?

ну а меня есть гуевая прога на 58 кб, из которых 40 кб иконка для окна. но это же не значит что все проги будут не более 58 кб, правда? если у тебя гента - сделай ls /usr/portage/dev-libs и линкуй до посинения, либ на всех хватит

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

И? Никто не мешает линковать динамически. Единственная причина, по которой ваша прога весит 58кб, - это наличие нужных либ с системе.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Я о том, что если на сайте проги висит .deb, мне от этого ни холодно, ни жарко. А ставлю я всю через portage, конечно же

я видел как минимум 5 ебилдов, которые скачивали .srpm вместо исходников. если линк статический, за который так громко кричат местные растоманы - то можно вообще .deb распаковать и не париться.

upcFrost ★★★★★
()
Ответ на: комментарий от RazrFalcon

Единственная причина, по которой ваша прога весит 58кб, - это наличие нужных либ с системе

не совсем. просто это чистый fasm, да еще и под kolibri.

Никто не мешает линковать динамически

а как же версии либ? надо ж пакетить тогда чтоб точно работало под нужный дистр

upcFrost ★★★★★
()
Ответ на: комментарий от eao197

В реальности ситуации могут быть более запутанные, в которых компилятор будет молчать как рыба об лед

Ну вот, просто в качестве иллюстрации (gcc-6.3.0, вместе с -pedantic, -Wall, -Wextra): https://wandbox.org/permlink/x9sAaLZx6TTAf6wp

В Rust-е просто так подобный код не напишешь. Что не может не радовать.

eao197 ★★★★★
()
Ответ на: комментарий от upcFrost

Около 8, норм.

шел 2017 год.

Ну как раз динамическая линковка это тренд 80х-90х, сейчас в тренде все делать статическим. Не могу сказать что я за такой подход полностью, но в данном случае он оправдан.

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Ой, ну надо же, интелигэнтик в очечках и со скрипочкой... Образованный вы наш, вы про SPARK (раз, два) слышали когда-нибудь что-нибудь? Или это для вас из категории legacy?

eao197 ★★★★★
()
Ответ на: комментарий от mersinvald

Ну как раз динамическая линковка это тренд 80х-90х, сейчас в тренде все делать статическим

а 10 лет назад в тренде были эмо. и что?

в данном случае он оправдан

обоснуй. кресты тоже можно статически слинковать, но как ты понимаешь - десктопный проект никто так линковать не будет. если про микруху речь, то там да, вполне

upcFrost ★★★★★
()
Ответ на: комментарий от makoven

Не улавливаю сути и смысла сарказма. Или ты предлагаешь свои добровольные услуги мейнтейнера?

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Собираем на древней убунте/rhel и вперёд. Как по вашему работает тот же vscode?

эээ... вы таки хотите сказать что если я сейчас на бубунте 12.04 сделаю бинарь и подсуну его в в 17.04, то он взлетит?

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

обоснуй.

Всё банально: у меня нет личного мейнтейнера на поддержку зоопарка дистрибутивов с их версиями openssl, glibc, и прочего, что обычно линкуется динамически.
По этому просто есть статический бинарь, запакованный в .deb и .rpm, который хоть на void linux распакуй и он будет работать, лишь бы архитектура была x86_64.

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Только работать он не будет

если полная статика - вероятность довольно высокая что будет. местные растоманы же за это и держатся как за основной аргумент

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

Не перевирай: держусь только я и я привел аргумент почему конкретно я выбрал статическую линковку для распространения готовых бинарей. По дефолту rustc линкует динамически.

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от mersinvald

Всё банально: у меня нет личного мейнтейнера на поддержку зоопарка дистрибутивов с их версиями openssl, glibc, и прочего, что обычно линкуется динамически

и тот же opensuse build service ты не осилил, да? фуф, ну давай уж скинь сцыль на код если опенсорс, опакечу тебе. сделать пакеты под 5-6 основных дистров с нуля для небольшой проги - дело одного-двух дней если вообще без опыта. с опытом можно в самом тупом случае вообще за час управиться.

По этому просто есть статический бинарь, запакованный в .deb и .rpm, который хоть на void linux распакуй и он будет работать, лишь бы архитектура была x86_64

а вот RazrFalcon только что сказал что не будет.

upcFrost ★★★★★
()
Ответ на: комментарий от RazrFalcon

Мы же про .deb говорим, откуда там статика?

погоди. так, ладно, выдыхаем, пересчитываем пальцы на руке. как формат пакета связан с типом линковки?

Ну и что значит «полная статика»? Вместе с glibc, X11 и прочим?

внезапно

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

а вот RazrFalcon только что сказал что не будет.

Я этого не говорил.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

А поддерживать этот зоопарк кто будет, Печкин?

ну да, а веб-хуки осиливать матроскин будет с дядей федором напару. тебе что, на тот же rpm надо каждый раз полспека переписывать?

upcFrost ★★★★★
()
Ответ на: комментарий от mersinvald

сейчас в тренде все делать статическим

Слова «в тренде» - означают «необоснованный выбор».

anonymous
()
Ответ на: комментарий от upcFrost

как формат пакета связан с типом линковки?

Если мы говорим не о пропритеращине, то смысла в статической линковке внутри пакета - 0. Суть пакета как раз в том, что он сам подтянет нужные зависимости, и не нужно будет возится со статикой.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

Не новость. Потому я и подпер свой небоснованный выбор обоснованием дальше по треду.

mersinvald ★★★★★
() автор топика
Последнее исправление: mersinvald (всего исправлений: 1)
Ответ на: комментарий от mersinvald

ага, а по ссылке раст. а в репах тухлая версия. ну вот собственно и проблема с пакетами. если бы все юзали то что в репах вместо rustup - проблемы бы не было.

p.s. попробую опакетить сегодня вечером. с go уже научился из этого дела выкручиваться

upcFrost ★★★★★
()
Ответ на: комментарий от RazrFalcon

Суть пакета как раз в том, что он сам подтянет нужные зависимости, и не нужно будет возится со статикой

мьсе путает пакет и систему управления пакетами. пакет никуда ничего не подтягивает

upcFrost ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.