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)

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

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

Мне кажется, все таки немного наоборот: растап юзают потому что там всегда актуальная версия, а пакеты в дистрибутив прилетают с большим запозданием. Хотя, спорно, да. Если бы Core Team мейнтейнила, задержек бы не было.

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

Если оставишь скриптец или ридмиху что и как — буду премного благодарен

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

Пакет без ПМ просто архив. Ваш КО.

ок. rpm (который команда а не архив, аналогично dpkg) это пакетный менеджер или нет?

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

http://imgur.com/a/b0y6k как-то так открывает ЛОР, ютуб не открывает. Кнопки справа не работают при активном использовании. Интерфейс на джаваскрипте жутко глючит и тормозит, само всё отжирает больше 50% процессорного времени. В общем, интерфейс совсем плохо работает. Движок еще так себе, особенно с перекрывающими div-ами или чем там.

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

Это основная часть ПМ

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

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

так что вот это утверждение неверно от слова совсем.

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

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

Если оставишь скриптец или ридмиху что и как — буду премного благодарен

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

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

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

Ну статический бинарь сейчас собирается и уже есть пакеты с ним, в том числе в АУРе.
Я так понял ты про каноничный динамический бинарь говорил)

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

Динамические линки только к системным сишным либам. Растолибы статически линкуются по дефолту.

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

Это серво? А то тут вот товарищ RazrFalcon глаголит, что есть некий квантум. Что его прям уже можно потыкать. Но я не нашел на первых страницах гугла - значит его как бы не очень существует.

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

Не знаю каким местом вы ищете

https://wiki.mozilla.org/Quantum

TL;DR Quantum — это проект по интеграции наработок Servo в Gecko. Servo — это площадка для экспериментов, никто не собирается на нее переводить файрфокс.

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

так что вот это утверждение неверно от слова совсем.

В вашем понимании ПМ - возможно.

Если я начну устанавливать .deb в debina-based дистре, то прописанные в пакете зависимости сами установятся. Или у вас какой-то другой ПМ?

Я на линуксе с 2008-го. Проблем с ПМ никогда не было, ни на убунте, ни на арче, ни на генту.

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

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

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

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

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

Если я начну устанавливать .deb в debina-based дистре, то прописанные в пакете зависимости сами установятся. Или у вас какой-то другой ПМ?

да ну? ПМ дебиана - это dpkg, а нет apt, если что.

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

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

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

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

Зависимости из интернета (cargo) то только при сборке пакета нужны

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

До следующего релиза только хотфиксы.

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

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

Я на убунту уже давно не был, но не помню такого. Когда-то баловался с написанием своих пакетов - все зависимости ставились сами.

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

Я на debian никогда не сидел, но на ubuntu приходилось ждать следующего релиза.

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

dpkg без апта ничего не подтянет сам. После установки пакета надо делать apt install -f чтобы доустановить зависимости и пакет

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

подтаскивает зависимости apt-get или aptitude - это, строго говоря, надстройки над самим менеджером, каковым является dpkg - и да, он просто ругнется на неудовлетворенные зависимости и не поставит пакет, а не будет что-то там искат и качать. Ровно так же, как и rpm.

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

А разве через apt нельзя установить deb? Смысл тогда от пакета, не пойму. Я же как-то ставил пакеты и с зависимостями проблем не было.

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

Где бы я слышал о языке, с такой чёткой специализацией? Авиация не моя область.

SPARK над Ada — это не только авиация, но еще и транспорт, и медицина, как минимум. Но дело не в этом. А в том, что когда вам говорят про активное использование Ada в нишах, в которых востребованы безопасные языки системного программирования, вы сперва обзываете это легаси, а потом говорите про аргументы «уровня дворовой шпаны». Молодца, чё сказать...

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

Зависимости из интернета (cargo) то только при сборке пакета нужны

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

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

А разве через apt нельзя установить deb?

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

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

Оу... а зачем так?

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

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

а что в раст уже libastral завезли?

Это называется ownership/borrowing system. В других языках такого (пока) нет, это уникальная фича раста. Является его самым главным достоинством и конкуретным преимуществом. Но с обратной стороны писать код становится немного сложнее, особенно новичкам.

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

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

ого, ради простого способа выстрелить себе в ногу, в дело пошёл с++14 и лямбды, но не move constructor. ну-ка ну-ка, а каким будет значение х:

int x = 10;
x = x++;
std::cout << x << std::endl;
anonymous
()
Ответ на: комментарий от eao197

Ну ок, полу-легаси. Но это же производство: не сломалось - не меняем. Чем не легаси?

RazrFalcon ★★★★★
()

граждане, а есть аналог std::set в расте? вот чтоб не HashSet, а конкретно дерево, в котором можно по итератору дропнуть элемент, получить следующий итератор. в котором можно upper и lower bound. В котором итераторы bidirectional

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

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

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

активное использование Ada в нишах, в которых востребованы безопасные языки системного программирования

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

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

Я конечный пользователь, а не мейтейнер. Мне такие тонкости не интересуют

это не тонкости. кстати хочу заметить, специально для КО, что пакет - это не просто «архив». это архив, в котором помимо файлов приложения может быть еще хренова туча скриптов, конфигов и манов. и пакетный менеджер знает как и в каком порядке их выполнять.

upcFrost ★★★★★
()

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

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

Я в курсе что из себя представляет пакет. Ибо я их писал. Но он не перестаёт быть просто архивом без ПМ.

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

Там проблема в уровне детализации. Нельзя написать двосвязный список не используя unsafe и shared pointer. Все дело в том что это небезопасно. В этом же смысле в c и c++ весь код небезопасен, но все же, это огорчает некоторіх людей.

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

Вообще-то речь шла о том, что сравнивать скорость кода на Rust-е можно не только со скоростью C/C++ и D. Но еще и со скоростью Ada. Поскольку a) Ada вполне себе жив, развивается и используется (хотя в наших Палестинах об этом не знают) и b) Ada используется как раз в тех нишах, куда хочет метить и Rust — системное программирование.

ИМХО, ограниченность применения Ada такими узкими областями, как авиация/космос, военные разработки на Западе, транспорт и медицина подобному сравнению с Rust-ом никак не мешает.

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

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

А ты посмотри на их киллер приложение Servo. Там уже 300 МЕГАБАЙТ исходного кода!!! При том что это еще сырое нерабочее говно. Если лет через десять они его таки допилят до вменяемого состояния, том там кода уже за гигабайт перевалит. Это чтобы представить, что там за сброд сидит.

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