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)

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

Кстати, давно заметил, что статьи по CS тематике отсутствующие в русской википедии зачастую можно найти в украинской.

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

Ну а разве есть еще языки, в которых неиспользуемая переменная — ошибка?

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

На Go, если что, не пишу и не планирую. А вот в плюсах и расте предпочитаю все предупреждения исправлять.

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

Есть runtime-fmt.

В курсе, но он тут ни при чём. Я «придрался» к тому, что println! не обязательно принимает форматную строку.

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

Предупреждения опциональны: по время отладки эти принудительные ошибки о неиспользованных импортах и переменных сильно достают без какого-либо реального повода.

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

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

работает или нет

Проверил на ubuntu — все ставится и работает)

Спасибо огромное, вечером заведу акк и отпишусь)

Из скрипта будет понятно как это всё делается, чтобы самостоятельно добавить конфиг-файл в /etc, например, или потом использовать его для сборки чего-то еще?

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

This

Rust говно, Ada рулит!

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

Зареквестил доступ на build.opensuse.org, логин тот же что и тут

добавил. по поводу скрипта - понимаешь, пакеты собирать для мелких прог (бинарь+конфиг+ман) мозгов особо не надо, это что-то типа заполнения налоговой отчетности. много всяких мелких дурацких действий типа «распаковал - поправил версию - упаковал - чексумма - размер», которые по первому разу особенно могут показаться странными.

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

я кстати почему так на разрабов воняю про rustup. ну подняли бы свой реп, великая блин задача для одной (одной блин!) проги сделать реп и спеки подправлять раз в релиз. пусть даже все их эти крейты ставятся в хомяка, ладно, но один пакет поддерживать на том же obs - это задача для первоклассника. тем более что obs сам создает полноценный реп который можно зацепить в apt/yum.

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

Смысл rustup в том чтобы:
1) держать много разных версий раста одновременно и легко переключаться между ними
2) обновлять nightly каждый день
3) фиксировать версию для конкретного проекта
4) Добавлять только нужные компоненты компилятора (например исходнки, rls, или сборки стандартной библиотеки под другие архитектуры) под разные версии из пункта 1.

Такое стандартным пакетным менеджером не сделаешь. Разве что можно сам rustup опакетить чтобы не качать с сайта.

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

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

update-alternatives/eselect/что-там-в-rhel. немного геморройно, но возможно. зависит от цикла релизов.

обновлять nightly каждый день

с этим спорить не буду. но имхо это безумие нужно 3.5 калекам. последнего стабильного релиза хватит.

фиксировать версию для конкретного проекта

да, это сложнее, согласен.

Добавлять только нужные компоненты компилятора (например исходнки, rls, или сборки стандартной библиотеки под другие архитектуры) под разные версии из пункта 1

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

Разве что можно сам rustup опакетить чтобы не качать с сайта

ну так его тоже опакетить можно.

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

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

последнего стабильного релиза хватит.

Нет. Nightly юзают очень многие, так как на нем обкатываются все вкусные фишки, которые до стабилизации дойдут ооочень не скоро

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

Nightly юзают очень многие, так как на нем обкатываются все вкусные фишки, которые до стабилизации дойдут ооочень не скоро

и ты прям хочешь сказать что люди делают свой stable релиз на nightly компиляторе?

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

Нет, основной кейс это разработчик сидит на nightly и пользуется RLS, cargo bench, и прочими плюшками, потом когда хочет зарелизить свою прогу проверяет что она собирается стабильной версией и делает релиз.

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

Но некорторые идут дальше (например rocket.rs) и пользуются фишками языка которых нет в стабильной версии. Тогда стабильная им вообще не нужна, только nightly.

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

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

Спорно, ну да ладно.

А initializer lists за что?

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

По крайней мере первый тип утечек жестко локализован в unsafe

std::mem::forget не требует unsafe, да и циклические ссылки можно в безопасном коде устроить.

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

rustcc и cargo, эффективность которых... Да не с чем сравнивать

Так и запишем: на расте реализованы проекты не имеющие аналогов.

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

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

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

mem::forget случайно не применишь

С этим не спорю.

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

с этим спорить не буду. но имхо это безумие нужно 3.5 калекам. последнего стабильного релиза хватит.

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

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

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

пока разрабы софта сидят на nightly, и пока разрабы языка не догадаются опакетить хотя бы свой компилятор (кстати сюрприз, nightly тоже можно пакетить через CI, как я уже сказал мозгов пакет собрать особо не надо) - раст так и будет хипстоязыком. та же нода вот пытается выбраться из этого статуса, и они уже подняли свой реп, куда скидывают stable для кучи дистров. в идеале конечно надо пакетить сразу все что можно, как для того же перла, но для этого комьюнити должно быть адекватным, без смузи-driven development.

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

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

В сотый раз: проблемы 1% никого не волнуют.

Вон в gentoo есть раст нескольких версий и толку? Я всё равно использую rustup, ибо удобнее.

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

Шутка не удалась. Попробуйте ещё раз.

Как бы он все правильно сказал.

Я бы может и посмотрел на него еще раз, когда он дозреет. А дозреет он когда будет стабильная версия для всех дистрибутивов. И писать я буду на версии, которая самая старая из всех поддерживаемых дистрибутивов. Если вы так не делаете - то играете в песочнице.

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

Шутка не удалась. Попробуйте ещё раз

это не шутка. если раст претендует на звание серьезного языка - его инфраструктура и методы ее использования должны соответствовать этому. если же целевая аудитория 1% хипсторов - то конечно можно оставить все как сейчас

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

Если вы так не делаете - то играете в песочнице.

Прямо так и без вариантом? А если растовый код планируется не пользователям отдавать, а работать он будет в контролируемом окружении, то какая разница какая версия в дистрибутивах?

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

Он предоставляет возможность безболезненного использования на 3-х основных DesktopOS. Что вам ещё нужно? Если ваш дистр до сих пор не содержит rust - это ваши проблемы. Пинайте мейнтейнеров.

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

А если растовый код планируется не пользователям отдавать, а работать он будет в контролируемом окружении, то какая разница какая версия в дистрибутивах?

что есть «контролируемое окружение»? типа у разраба на компе? не, пожалуйста. а смысл тогда в нем?

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

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

на звание серьезного языка

Попробуйте установить любой компилятор C++ под виндой - это ад. Так что ваше утверждение бессмысленно.

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

Если ваш дистр до сих пор не содержит rust - это ваши проблемы. Пинайте мейнтейнеров.

Немного не так. Зачем мне писать на rust, если не все дистрибутивы с ним?

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

а работать он будет в контролируемом окружении

Э... что по вашему означает «песочница»?

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

И как это вас останавливает? Пока вы доведёте свой велосипед до нормального состояния, и он будет настолько нужен, что его подумают включить в основной репозиторий - раст уже будет устаревшим языков.

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

Если ваш дистр до сих пор не содержит rust - это ваши проблемы. Пинайте мейнтейнеров.

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

Попробуйте установить любой компилятор C++ под виндой - это ад

венда еще со времен доса устраивала в фс лютый базар. и кстати вот сейчас они как раз пытаются вернуть это в нормальное русло при помощи всех этих маркетов и прочего, которые ставят софт согласно замыслу мелкомягких, а не в C:\Vasya\MyFolder. еще немного - и начнут симлинки прокидывать в какой-нибудь аналог /usr/bin, либы хранить в одной директории и так далее.

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

раст уже будет устаревшим языков.

Назови устаревший язык не включенный в дистрибутив?

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

У него есть рабочий компилятор?

да пес его знает, я его раз в жизни видел. не обращай внимания, это так, щютка

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

При чём тут нода? Она кроме линя и так нигде не нужна.

ок, пузон тоже не нужен? перл тоже? жаба, у который также пакетят именно компилятор и саму машину? а что нужно вообще? пасьянс?

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

Э... что по вашему означает «песочница»?

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

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

Типа на своём сервере.

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

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

если «играть», конечно, не было сказано в пренебрежительном смысле

Здесь смысл на выбор. «Играть на поле» или играть в противопоставление долгоживущим программам.

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

в этом случае разумеется ни пакеты, ни инфраструктура не нужны.

Раст позволяет собрать статичный бинарь для линя, который будет работать на любом дистре. Что ещё нужно?

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

В генту столько мороки с перлом, что лучше бы вообще не пакетили его.

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

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

Раст позволяет собрать статичный бинарь для линя, который будет работать на любом дистре. Что ещё нужно?

соберешь мне лису в один мелкий бинарь, да еще так чтоб дырки в ней автоматом латались?

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