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)
Ответ на: комментарий от mersinvald

Спасибо. Выглядит пострашнее чем в хаскеле, но есть надежда что быстрее.

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

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

Ушёл на salix только за то, что там не опакечивают то, что опакечивать не надо. Саликс это слакварь, над примитивной пакетной системой которой таки достроили поддержку зависимостей.

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

Я не спорю. Для разработки да. Но нужно трезво понимать что это не венда и есть общепринятые нормы организации размещения файлов в фс. И иногда твой комп это вообще тонкий клиент, либо его могут юзать больше одного человека (сын/жена например). Так что имхо пункт об обновлении пользовательской, а не системной версии необходим.

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

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

Да не будет тут проблем с либами: свои растовые либы линкуются статически, а с системными проблемы везде и все равно надо либо опакечивать для конкретной версии дистра с учетом динамической линковки к его версиям сишных либ либо собирать полностью статический бинарник на мусле для всех (как я и делаю)

mersinvald ★★★★★
() автор топика

А выход этой версии приблизил исчезновение цепепе? :-)

anonymous
()

Цепепе - долой! Даешь Растишку в массы! Перепишем за первую пятилетку ядрышко Лялиха на Растишке! Избавим ядро от дыр, утечек и багов, связанных с памятью!

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

надо либо опакечивать для конкретной версии дистра с учетом динамической линковки к его версиям сишных либ

А вот другого либо не должно быть. Если это так, то это песочница. Вы в ней играетесь. Вам хорошо. Но пользователей не ждите. Пользователи идут вместе с программами в дистрибутиве, а это пакетный менеджер дистрибутива.

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

из крейта libc.

Лол, розововолосые растожирухи не осилили написать прямой интерфейс к сисколлам?

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

Смеялись всем микрософтом

Вот смешно. Про..али все планшеты, сервера, смартфоны и телефоны.

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

А кто сказал что я не опакечиваю?

Просто ставить в докер 100500 дистров и клепать deb и rpm пакеты под разные версии RedHat, Debian, etc — какой смысл, если я могу опакетить статический бинарь?)

Чтобы не быть голословным

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

Просто ставить в докер 100500 дистров и клепать deb и rpm пакеты под разные версии RedHat, Debian, etc — какой смысл, если я могу опакетить статический бинарь?)

Ну и как? Включают этот статический бинарь в дистрибутив? Что бы вместе с обновлением очередной либы обновлять еще и твою программу?

anonymous
()

Ребят, вопрос такой. Стоит ли начинать учить Rust вместо Си? Или Си ещё актуален? Я имею ввиду актуален не в том смысле что на нём ещё полно программ и целых ОС, а в том что на нём ещё есть смысл писать код. А то плюсы Раста в сравнении с Си весьма мотивируют

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

Я в репозитории дистров и не лезу, если надо будет — опакетят с системными либами кому нужно. Я предоставляю пакеты, которые юзеру удобно устанавливать стандартным способом для их пакетного менеджера. Дальше — не мое дело)

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

На Си либо писать новый код под микроконтроллеры (пока раст не готов туда влезть, но тоже будет), либо поддерживать старый системный код.
Ну и раст до уровня «могу писать качественный безопасный код» ты освоишь намного быстрее.

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

Дальше — не мое дело)

Вот потому речь и зашла, что вам дальше песочницы смотреть не интересно.

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

Лол, розововолосые растожирухи не осилили написать прямой интерфейс к сисколлам?

Осилили (https://github.com/japaric/steed/) - но «по умолчанию» Rust линкуется к системным билиотекам. С libc ситуация такая:

  1. Системная libc.so
  2. К ней линкуется crate libc - это просто много extern'ов
  3. Дальше есть nix (https://github.com/nix-rust/nix, http://kamalmarhubi.com/blog/2016/04/13/rust-nix-easier-unix-systems-programm...), который оборачивает тот же Unix API в более приятный Rust'овый вид
  4. И есть crate std (стандартная библиотека Rust), которая оборачивает libc в высокоуровневые штуки типа std::fs::File

Примерно так же делают для остальных библиотек:

  1. Системная libsmth.so
  2. crate smth-sys - много extern'ов
  3. crate smth - удобные обёртки

В результате после компиляции программа стандартно подтягивает системные shared libraries, а удобные обёртки оптимизируются на этапе компиляции (zero-cost abstractions!)

Хотя бывают ре-реализации на чистом Rust'е с нуля. Вот, например, недавно написали свою реализацию (протокола) Wayland: https://users.rust-lang.org/t/skylane-implementation-of-wayland-protocol

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

А зачем? Я пишу узконишевую утилиту, у которой в репозиториях аналогов нет. Если будет спрос на пакет в репозитории, сделаю. Пока что никто не просил)

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

Так что имхо пункт об обновлении пользовательской, а не системной версии необходим.

просто запускай rustup от юзера

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

Стоит ли начинать учить Rust вместо Си? Или Си ещё актуален?

Технически - не актуален, разве что для экзотических платформ, с которыми у LLVM плохо. Под микроконтроллеры вот уже пишут на Rust: http://blog.japaric.io/quickstart/

Экономически - со знанием C/C++ пока всё-таки легче найти проект/работу. Можно надеяться, что лет через 5 станет наоборот, Rust очень быстро растёт.

Выучить в любом случая стоит оба, они оба очень развивают мышление и учат по-другому смотреть на вещи.

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

Выучить в любом случая стоит оба

+, в системное программирование влезть без знания Си будет трудно, да и Rust легче пойдет после изучения Си.

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

Ты предлагаешь пользовательские версии которых два десятка быть может, да еще и разные у разных юзеров, в /opt писать? И это я после этого извращенец?

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

Это вообще боль. Купил, а потом узнал что там только GCC4 поддерживается и всякие извращения типа lua на nodeMCU.

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

Стоит ли начинать учить Rust вместо Си? Или Си ещё актуален?

Работы на С намного больше, чем на расте. Хотя и на последнем вакансии начинают появляться.

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

нескоро, многие его просто не могут осилить (я в их числе) ;-)

На самом деле Rust гораздо проще C++, просто выглядит непривычно. Основная фишка в том, что не надо зубрить что можно делать, а что нельзя. Если сделаешь что-то неправильно, то получишь ошибку компиляции.

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

Если сделаешь что-то неправильно, то получишь ошибку компиляции.

Проблема только в том, что «правильно» не все реализовать можно. Придется включать возможность реализовать «неправильно».

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

Если сделаешь что-то неправильно, то получишь ошибку компиляции

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

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

Ну вот такую ерунду в Rust-е просто так не напишешь:

string & concat(string &a, string &b) {
  string r = a+b;
  return r;
}
Подобный уровень защиты от отстрела ног для нынешнего обилия малолетних дебилов в ИТ просто сложно переоценить.

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

просто запускай rustup от юзера

от рута подобные команды нормальные люди имхо запускать вообще не должны.

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

шел 2017 год... ну пока бинарь меньше 10-20 мег это наверно сойдет.

А использовать такие программы будут только скачав вручную с сайта разработчика.

Возможно разработчика. Вообщем, откуда-то скачав. Ну может и с закладками... А что, такие бывают? Надо же.... Не знал. Нах... это поделие.

anonymous
()

вот что круто в раст - так это карго. карго это круто. в раст. а что там еще круто? Пойду попробую переписанные либы опять собрать и замерить скорость. в прошлый раз всего 20% раст пролюблювал, старому коду на старой сишке из 90-х.

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

Си намного проще раста, а раст пытается решить «проблемы» Си, так что логично идти изучать Си вначале.

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

А в тупом goвне я добавляю флаг -tags netgo и получаю абсолютно статический бинарник.

Ну если очень нужно статический бинарник...

# скачиваем std, один раз
$ rustup target add x86_64-unknown-linux-musl
# создаём проект (по умолчанию там сразу Hello world)
$ cargo new --bin hello
$ cd hello
# компилируем
$ cargo build --target=x86_64-unknown-linux-musl
# проверяем
$ ldd target/x86_64-unknown-linux-musl/debug/hello
not a dynamic executable
# запускаем (можно и через cargo run)
$ target/x86_64-unknown-linux-musl/debug/hello
Hello, world!
anonymous
()
Ответ на: комментарий от umren

Си намного проще раста

https://news.ycombinator.com/item?id=10865953:

You mean it's easier to write an incorrect program in C than a correct one in Rust? Of course!

If you mean it's easier to write correct programs in C than correct programs in Rust, I'm afraid you're badly mistaken."

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

Подобный уровень защиты от отстрела ног для нынешнего обилия малолетних дебилов в ИТ просто сложно переоценить.

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

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

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

вообще-то компилятор с++ выдаст предупреждение на такой код

предупреждения для лохов, тормоза придумал трус. хренак-хренак-скомпилилось - и в продакшн.

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

Вместе со своими шрифтами? Чтобы не отставать от Go?

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