<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>rustycrate.ru</title>
    <description>Неофициальный русскоязычный сайт о языке программирования Rust
</description>
    <link>https://rustycrate.ru/</link>
    <atom:link href="https://rustycrate.ru/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 19 Jul 2019 22:46:02 +0000</pubDate>
    <lastBuildDate>Fri, 19 Jul 2019 22:46:02 +0000</lastBuildDate>
    <generator>Jekyll v3.2.1</generator>
    
      <item>
        <title>Выпуск Rust 1.34.0</title>
        <description>&lt;p&gt;Команда разработчиков Rust рада сообщить о выпуске новой версии Rust, 1.34.0.
Rust — это язык программирования, который даёт возможность каждому создавать
надёжное и эффективное программное обеспечение.&lt;/p&gt;

&lt;p&gt;Если у вас установлена предыдущая версия Rust с помощью rustup, то для
обновления Rust до версии 1.34.0 вам достаточно выполнить:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;$ rustup update stable
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если у вас ещё не установлен rustup, вы можете &lt;a href=&quot;https://www.rust-lang.org/install.html&quot;&gt;установить его&lt;/a&gt; с
соответствующей страницы нашего веб-сайта.&lt;/p&gt;

&lt;h2 id=&quot;chto-voshlo-v-stabilnuiu-viersiiu-1340&quot;&gt;Что вошло в стабильную версию 1.34.0&lt;/h2&gt;

&lt;p&gt;Основное улучшение этого выпуска это поддержка альтернативных cargo-реестров.
Релиз также включает поддержку &lt;code class=&quot;highlighter-rouge&quot;&gt;?&lt;/code&gt; в документационных тестах, некоторые
улучшения в &lt;code class=&quot;highlighter-rouge&quot;&gt;#[attribute(...)]&lt;/code&gt; и стабилизацию &lt;code class=&quot;highlighter-rouge&quot;&gt;TryFrom&lt;/code&gt;.
Читайте далее о ключевых вещах или можете посмотреть &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1340-2019-04-11&quot;&gt;подробные примечания к выпуску&lt;/a&gt;
для дополнительной информации.&lt;/p&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;h3 id=&quot;altiernativnyie-cargo-rieiestry&quot;&gt;Альтернативные &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo&lt;/code&gt; реестры&lt;/h3&gt;

&lt;p&gt;Ещё до версии 1.0 у Rust был публичный реестр, &lt;a href=&quot;http://crates.io/&quot;&gt;crates.io&lt;/a&gt;.
Люди публиковали крейты при помощи &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo publish&lt;/code&gt; и легко подключали
эти крейты в секции &lt;code class=&quot;highlighter-rouge&quot;&gt;[dependencies]&lt;/code&gt; в &lt;code class=&quot;highlighter-rouge&quot;&gt;Cargo.toml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Однако не все &lt;em&gt;хотят&lt;/em&gt; публиковать свои крейты на crates.io.
Люди, поддерживающие проекты с закрытым исходным кодом,
не могли использовать crates.io, и вместо этого им приходилось
указывать &lt;code class=&quot;highlighter-rouge&quot;&gt;git&lt;/code&gt; или &lt;code class=&quot;highlighter-rouge&quot;&gt;path&lt;/code&gt; в зависимостях.
Здесь нет ничего такого для небольших проектов, но если в вашей
большой организации есть много крейтов с закрытым кодом, вы теряете
преимущества поддержки версионирования, которое есть в crates.io.&lt;/p&gt;

&lt;p&gt;Начиная с этого выпуска, Cargo может поддерживать альтернативные реестры.
Эти реестры сосуществуют с crates.io, так что вы можете писать программы,
которые зависят и от crates.io, и от вашего реестра.
Однако крейты на crates.io не могут зависеть от внешнего реестра.&lt;/p&gt;

&lt;p&gt;Для использования альтернативных реестров, вы должны добавить следующие
строки в &lt;code class=&quot;highlighter-rouge&quot;&gt;.cargo/config&lt;/code&gt;. Этот файл может быть в вашей домашней
директории (&lt;code class=&quot;highlighter-rouge&quot;&gt;~/.cargo/config&lt;/code&gt;) или быть в директории пакета.&lt;/p&gt;

&lt;div class=&quot;language-toml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nn&quot;&gt;[registries]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;my-registry&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://my-intranet:8080/git/index&quot;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Добавить зависимость из альтернативного реестра легко.
Когда вы указываете зависимость в &lt;code class=&quot;highlighter-rouge&quot;&gt;Cargo.toml&lt;/code&gt;, используйте ключ
&lt;code class=&quot;highlighter-rouge&quot;&gt;registry&lt;/code&gt; чтобы Cargo знал что вы хотите получать крейт из альтернативного реестра:&lt;/p&gt;

&lt;div class=&quot;language-toml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nn&quot;&gt;[dependencies]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;other-crate&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;1.0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;registry&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;my-registry&quot;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Как автор крейта, если вы хотите публиковать ваш крейт в
альтернативном реестре, первым делом вам надо сохранить
аутентификационный токен в &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.cargo/credentials&lt;/code&gt; при помощи команды
&lt;code class=&quot;highlighter-rouge&quot;&gt;cargo login&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;cargo login --registry&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;my-registry
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Далее вы можете использовать флаг &lt;code class=&quot;highlighter-rouge&quot;&gt;--registry&lt;/code&gt; для указания реестра,
в который будет публиковаться крейт:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;cargo publish --registry&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;my-registry
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;О том, как вы можете запустить свой собственный реестр, вы можете найти
в &lt;a href=&quot;https://doc.rust-lang.org/nightly/cargo/reference/registries.html#running-a-registry&quot;&gt;документации&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;v-dokumientatsionnykh-tiestakh&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;?&lt;/code&gt; в документационных тестах&lt;/h3&gt;

&lt;p&gt;В &lt;a href=&quot;https://rust-lang.github.io/rfcs/1937-ques-in-main.html&quot;&gt;RFC 1937&lt;/a&gt; было предложено добавить поддержку использования оператора
&lt;code class=&quot;highlighter-rouge&quot;&gt;?&lt;/code&gt; в &lt;code class=&quot;highlighter-rouge&quot;&gt;fn main()&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;#[test]&lt;/code&gt; функциях и документационных тестах, позволяя
им вернуть &lt;code class=&quot;highlighter-rouge&quot;&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt; или &lt;code class=&quot;highlighter-rouge&quot;&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt; где вариант с ошибкой приводит
к ненулевому коду завершения в случае &lt;code class=&quot;highlighter-rouge&quot;&gt;fn main()&lt;/code&gt; или упавшему тесту в случае тестов.&lt;/p&gt;

&lt;p&gt;Поддержка в &lt;code class=&quot;highlighter-rouge&quot;&gt;fn main()&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;#[test]&lt;/code&gt; была реализована &lt;a href=&quot;https://blog.rust-lang.org/2018/05/10/Rust-1.26.html#main-can-return-a-result&quot;&gt;достаточно давно&lt;/a&gt;.
Однако поддержка в документационных тестах была ограничена тестами,
в которых явно присутствовал &lt;code class=&quot;highlighter-rouge&quot;&gt;fn main()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;В этом выпуске добавлена полная поддержка &lt;code class=&quot;highlighter-rouge&quot;&gt;?&lt;/code&gt; в документационных тестах.
Теперь вы можете написать в ваших документационных тестах такое:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;/// ```rust&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;/// use std::io;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;/// let mut input = String::new();&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;/// io::stdin().read_line(&amp;amp;mut input)?;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;/// # Ok::&amp;lt;(), io:Error&amp;gt;(())&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;/// ```&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;my_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Внизу документационного теста вам всё равно надо указывать тип ошибки, который будет использован.&lt;/p&gt;

&lt;h3 id=&quot;poddierzhka-proizvolnogho-potoka-tokienov-v-polzovatielskikh-atributakh&quot;&gt;Поддержка произвольного потока токенов в пользовательских атрибутах&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.rust-lang.org/2018/12/21/Procedural-Macros-in-Rust-2018.html&quot;&gt;Процедурные макросы&lt;/a&gt; в Rust могут определять пользовательские
атрибуты, которые они используют. До текущего момента эти атрибуты
были ограничены деревьями путей и литералами в соответствии со
следующим синтаксисом:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#[foo&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#[foo&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#[foo(bar&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#[foo(bar,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;baz(quux,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;))]&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В отличии от процедурных макросов, эти вспомогательные атрибуты
не могли принимать произвольный поток токенов в разделителе, из-за
чего вы не могли написать &lt;code class=&quot;highlighter-rouge&quot;&gt;#[range(0..10)]&lt;/code&gt; или &lt;code class=&quot;highlighter-rouge&quot;&gt;#[bound(T: MyTrait)]&lt;/code&gt;.
Крейты процедурных макросов вместо этого использовали строки для
синтаксиса, подобного такому, например &lt;code class=&quot;highlighter-rouge&quot;&gt;#[range(&quot;0..10&quot;)]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;С этим выпуском, пользовательские атрибуты &lt;code class=&quot;highlighter-rouge&quot;&gt;#[attr($tokens)]&lt;/code&gt; &lt;a href=&quot;https://github.com/rust-lang/rust/pull/57367&quot;&gt;позволяют использовать&lt;/a&gt; произвольные токены в &lt;code class=&quot;highlighter-rouge&quot;&gt;$tokens&lt;/code&gt;, приводя их в соответствии с макросами.
Если вы автор крейта процедурного макроса, пожалуйста проверьте
используются ли строки в синтаксисе ваших пользовательских атрибутах
и можно ли их заменить на поток токенов.&lt;/p&gt;

&lt;h3 id=&quot;tryfrom-i-tryinto&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;TryFrom&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;TryInto&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Трейты &lt;a href=&quot;https://doc.rust-lang.org/std/convert/trait.TryFrom.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;TryFrom&lt;/code&gt;&lt;/a&gt; и &lt;a href=&quot;https://doc.rust-lang.org/std/convert/trait.TryInto.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;TryInto&lt;/code&gt;&lt;/a&gt; были стабилизированы для поддержки
ошибок при преобразовании типов.&lt;/p&gt;

&lt;p&gt;Например, &lt;a href=&quot;https://doc.rust-lang.org/std/primitive.u32.html#method.from_be_bytes&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;from_be_bytes&lt;/code&gt;&lt;/a&gt; и связанные методы целочисленных типов
получают массив, но данные часто читаются через слайсы. Ручное
преобразование между слайсами и массивами утомительно. С новыми
трейтами это возможно сделать в одну строку с &lt;code class=&quot;highlighter-rouge&quot;&gt;.try_into()&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;u32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;from_be_bytes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.try_into&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Для преобразований, которые не могут завершиться с ошибкой, таких как &lt;code class=&quot;highlighter-rouge&quot;&gt;u8&lt;/code&gt; в &lt;code class=&quot;highlighter-rouge&quot;&gt;u32&lt;/code&gt;,
добавлен тип &lt;a href=&quot;https://doc.rust-lang.org/std/convert/enum.Infallible.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Infallible&lt;/code&gt;&lt;/a&gt;. За счёт этого &lt;code class=&quot;highlighter-rouge&quot;&gt;TryFrom&lt;/code&gt; автоматически реализуется для
всего, что реализует типаж &lt;code class=&quot;highlighter-rouge&quot;&gt;From&lt;/code&gt;. В будущем, мы надеемся сделать
&lt;code class=&quot;highlighter-rouge&quot;&gt;Infallible&lt;/code&gt; псевдонимом для &lt;a href=&quot;https://github.com/rust-lang/rust/issues/35121&quot;&gt;типа &lt;code class=&quot;highlighter-rouge&quot;&gt;!&lt;/code&gt; (never)&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;fn-beforeexec-ustariela-v-polzu-unsafe-fn-preexec&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;fn before_exec&lt;/code&gt; устарела в пользу &lt;code class=&quot;highlighter-rouge&quot;&gt;unsafe fn pre_exec&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;В Unix-подобных системах функция &lt;a href=&quot;https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.before_exec&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;CommandExt::before_exec&lt;/code&gt;&lt;/a&gt;
позволяла вам запланировать выполнение замыкания до вызова &lt;code class=&quot;highlighter-rouge&quot;&gt;exec&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Данное замыкание выполнялось в контексте дочернего процесса после форка.
Это означает, что ресурсы, такие как файловые дескрипторы и
области памяти, могли быть продублированы. Другими словами, вы
могли получить копию значения не &lt;code class=&quot;highlighter-rouge&quot;&gt;Copy&lt;/code&gt; типа в разных процессах,
в то время как оригинал оставался бы в родительском. &lt;a href=&quot;https://github.com/rust-lang/rust/issues/39575#issuecomment-437658766&quot;&gt;Это могло&lt;/a&gt;
привести к неопределённому поведению и сломать
&lt;a href=&quot;https://github.com/rust-lang/rust/issues/39575#issuecomment-439645949&quot;&gt;библиотеки, предполагающие отсутствие дублирования&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Следовательно, функция &lt;code class=&quot;highlighter-rouge&quot;&gt;before_exec&lt;/code&gt; должна быть помечена &lt;code class=&quot;highlighter-rouge&quot;&gt;unsafe&lt;/code&gt;.
В этом выпуске мы пометили &lt;code class=&quot;highlighter-rouge&quot;&gt;fn before_exec&lt;/code&gt; устаревшей в пользу
&lt;code class=&quot;highlighter-rouge&quot;&gt;unsafe fn pre_exec&lt;/code&gt;. При вызове &lt;a href=&quot;https://doc.rust-lang.org/std/os/unix/process/trait.CommandExt.html#tymethod.pre_exec&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;CommandExt::pre_exec&lt;/code&gt;&lt;/a&gt; вам
необходимо убедиться, что замыкание не нарушает инварианты
библиотеки создавая не валидные дубликаты. Если вы предоставляете
библиотеку, которая находится в подобной &lt;code class=&quot;highlighter-rouge&quot;&gt;before_exec&lt;/code&gt; ситуации,
подумайте об устаревании и предоставьте альтернативу с &lt;code class=&quot;highlighter-rouge&quot;&gt;unsafe&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;stabilizatsiia-v-bibliotiekakh&quot;&gt;Стабилизация в библиотеках&lt;/h3&gt;

&lt;p&gt;В 1.34.0 расширен набор стабильных атомарных целочисленных
знаковых и беззнаковых типов, начиная с 8 битных (&lt;a href=&quot;https://doc.rust-lang.org/std/sync/atomic/struct.AtomicU8.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;AtomicU8&lt;/code&gt;&lt;/a&gt;) и
заканчивая 64 битными.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1280-2018-08-02&quot;&gt;Ранее&lt;/a&gt; были стабилизированы ненулевые беззнаковые
целые числа, такие как &lt;a href=&quot;https://doc.rust-lang.org/std/num/struct.NonZeroU8.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroU8&lt;/code&gt;&lt;/a&gt;. Благодаря этому &lt;code class=&quot;highlighter-rouge&quot;&gt;Option&amp;lt;NonZeroU8&amp;gt;&lt;/code&gt;
имеет такой же размер, как и &lt;code class=&quot;highlighter-rouge&quot;&gt;u8&lt;/code&gt;. В этом выпуске стабилизированы
знаковые версии, например &lt;a href=&quot;https://doc.rust-lang.org/std/num/struct.NonZeroI8.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroI8&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Стабилизированы функции &lt;a href=&quot;https://doc.rust-lang.org/std/iter/fn.from_fn.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;iter::from_fn&lt;/code&gt;&lt;/a&gt; и &lt;a href=&quot;https://doc.rust-lang.org/std/iter/fn.successors.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;iter::successors&lt;/code&gt;&lt;/a&gt;.
Первая позволяет создать итератор из &lt;code class=&quot;highlighter-rouge&quot;&gt;FnMut() -&amp;gt; Option&amp;lt;T&amp;gt;&lt;/code&gt;. Чтобы
итеративно получать элементы из вектора, вы теперь можете написать
&lt;code class=&quot;highlighter-rouge&quot;&gt;from_fn(|| vec.pop())&lt;/code&gt;.
Тем временем вторая функция создаёт новый итератор, где каждый
следующий элемент вычисляется на основе предыдущего.&lt;/p&gt;

&lt;p&gt;Дополнительно, были стабилизированы следующие API:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/any/trait.Any.html#tymethod.type_id&quot;&gt;Any::type_id&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/error/trait.Error.html#method.type_id&quot;&gt;Error::type_id&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.slice.html#method.sort_by_cached_key&quot;&gt;slice::sort_by_cached_key&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.str.html#method.escape_debug&quot;&gt;str::escape_debug&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.str.html#method.escape_default&quot;&gt;str::escape_default&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.str.html#method.escape_unicode&quot;&gt;str::escape_unicode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.str.html#method.split_ascii_whitespace&quot;&gt;str::split_ascii_whitespace&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_add&quot;&gt;Instant::checked_add&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Instant.html#method.checked_sub&quot;&gt;Instant::checked_sub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_add&quot;&gt;SystemTime::checked_add&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.SystemTime.html#method.checked_sub&quot;&gt;SystemTime::checked_sub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для подробной информации смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1340-2019-04-11&quot;&gt;подробные примечания к выпуску&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 12 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2019/04/12/rust-1.34.0.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2019/04/12/rust-1.34.0.html</guid>
        
        
        <category>новости</category>
        
      </item>
    
      <item>
        <title>Шаблон индексирования для нового типа</title>
        <description>&lt;p&gt;Аналогично &lt;a href=&quot;https://matklad.github.io/2018/05/24/typed-key-pattern.html&quot;&gt;предыдущему посту&lt;/a&gt;,
мы попробуем добавить типы к коду Rust, который без них прекрасно работает.
В этот раз мы попробуем улучшить распространенный подход использования
индексов для управления циклическими структурами данных.&lt;/p&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;h1 id=&quot;probliema&quot;&gt;Проблема&lt;/h1&gt;

&lt;p&gt;Часто приходится работать со структурой данных, которая содержит циклические ссылки
вида: объект &lt;code class=&quot;highlighter-rouge&quot;&gt;foo&lt;/code&gt; ссылается на &lt;code class=&quot;highlighter-rouge&quot;&gt;bar&lt;/code&gt;, который ссылается &lt;code class=&quot;highlighter-rouge&quot;&gt;baz&lt;/code&gt;,
который в свою очередь ссылается на &lt;code class=&quot;highlighter-rouge&quot;&gt;foo&lt;/code&gt;.
Учебный пример здесь представляет собой граф вершин и ребер.
Однако на практике истинные графы встречаются редко.
Вместо этого, вы скорее всего увидите дерево с указателями на родителей,
которое содержит много тривиальных циклов,
и иногда неявные циклические графы: &lt;code class=&quot;highlighter-rouge&quot;&gt;Сотрудник (Employee)&lt;/code&gt;
может быть руководителем &lt;code class=&quot;highlighter-rouge&quot;&gt;Отдела (Department)&lt;/code&gt;,
и в &lt;code class=&quot;highlighter-rouge&quot;&gt;Отделе (Department)&lt;/code&gt; есть сотрудники &lt;code class=&quot;highlighter-rouge&quot;&gt;Vec&amp;lt;Employee&amp;gt;&lt;/code&gt;.
Это что-то вроде замаскированного графа: в обычных графах все вершины одного типа,
а вот &lt;code class=&quot;highlighter-rouge&quot;&gt;Сотрудник (Employee)&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;Отдел (Department)&lt;/code&gt; - это разные типы.&lt;/p&gt;

&lt;p&gt;Работать с такими структурами данных сложно на любом языке. Прибывать
в ситуации, когда &lt;code class=&quot;highlighter-rouge&quot;&gt;A&lt;/code&gt; указывает на &lt;code class=&quot;highlighter-rouge&quot;&gt;B&lt;/code&gt;, который указывает на &lt;code class=&quot;highlighter-rouge&quot;&gt;A&lt;/code&gt;, некоторая
форма изменчивости обязательна. Действительно, любой из объектов &lt;code class=&quot;highlighter-rouge&quot;&gt;A&lt;/code&gt; или &lt;code class=&quot;highlighter-rouge&quot;&gt;B&lt;/code&gt; может быть
создан первым, и поэтому он может не сразу после
создания указывать на другой объект.
Вы можете спрятать изменяемость с помощью &lt;code class=&quot;highlighter-rouge&quot;&gt;let rec&lt;/code&gt;, как в
&lt;code class=&quot;highlighter-rouge&quot;&gt;OCaml&lt;/code&gt;, или ленивости как в &lt;code class=&quot;highlighter-rouge&quot;&gt;Haskell&lt;/code&gt;, но она ни куда девается.&lt;/p&gt;

&lt;p&gt;Rust старается обнаруживать проблемы такого вида во время компиляции,
поэтому реализация таких графов в Rust является сложной задачей.
Три обычно применяемых подхода:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Подсчет ссылок, более подробно смотрите &lt;a href=&quot;https://github.com/nrc/r4cppp/blob/master/graphs/README.md#rcrefcellnode&quot;&gt;у nrc&lt;/a&gt;,&lt;/li&gt;
  &lt;li&gt;Арена и реальные циклические ссылки, объяснение от
&lt;a href=&quot;https://exyr.org/2018/rust-arenas-vs-dropck/&quot;&gt;simonsapin&lt;/a&gt; (это очень хороший пост!),&lt;/li&gt;
  &lt;li&gt;Арена целочисленные индексы, объяснение от &lt;a href=&quot;http://smallcultfollowing.com/babysteps/blog/2015/04/06/modeling-graphs-in-rust-using-vector-indices/&quot;&gt;nikomatsakis&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(по-видимому, переписывание учебника по монадам в Haskell для Rust
приводит к записям в блоге про графы).&lt;/p&gt;

&lt;p&gt;Лично мне больше всего нравится подход с индексами, но с ним
возникает другая проблема. С ссылками, вы имеете
&lt;code class=&quot;highlighter-rouge&quot;&gt;foo&lt;/code&gt; типа &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;amp;Foo&lt;/code&gt;, и сразу понятно что это такое
и что вы можете с этим сделать. С индексами, однако, у вас есть &lt;code class=&quot;highlighter-rouge&quot;&gt;foo: usize&lt;/code&gt;,
и не очевидно, что вы каким-то образом можете получить &lt;code class=&quot;highlighter-rouge&quot;&gt;Foo&lt;/code&gt;.
Даже хуже, если индексы используются для двух типов объектов, таких как &lt;code class=&quot;highlighter-rouge&quot;&gt;Foo&lt;/code&gt; и
&lt;code class=&quot;highlighter-rouge&quot;&gt;Bar&lt;/code&gt;, вы можете в конечном итоге получить &lt;code class=&quot;highlighter-rouge&quot;&gt;thing: usize&lt;/code&gt;. При написании кода с
использованием &lt;code class=&quot;highlighter-rouge&quot;&gt;usize&lt;/code&gt; на самом деле работает довольно хорошо
(хотя я не думаю, что когда-либо использовал неправильный тип индекса),
чтение его сложнее, потому что &lt;code class=&quot;highlighter-rouge&quot;&gt;usize&lt;/code&gt; гораздо менее информативно о том,
что вы могли бы сделать с полученным значением.&lt;/p&gt;

&lt;h1 id=&quot;triuk-s-novym-tipom-newtype&quot;&gt;Трюк с новым типом (Newtype)&lt;/h1&gt;

&lt;p&gt;Один из способов обойти эту проблему - это сделать обертку над &lt;code class=&quot;highlighter-rouge&quot;&gt;usize&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#[derive(Debug,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Copy,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Clone,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Ord,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;PartialOrd,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Eq,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;PartialEq,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Hash)]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;FooIdx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;usize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Arena&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;foos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;impl&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Arena&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FooIdx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;.foos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Здесь, “надо использовать &lt;code class=&quot;highlighter-rouge&quot;&gt;FooIdx&lt;/code&gt; в &lt;code class=&quot;highlighter-rouge&quot;&gt;Vec&amp;lt;Foo&amp;gt;&lt;/code&gt;”, это только соглашение.
Одно из достоинств Rust заключается в том, что мы можем превратить это
соглашение в свойство, проверенное во время проверки типа. Путем добавления
соответствующей реализации, мы сможем индексировать &lt;code class=&quot;highlighter-rouge&quot;&gt;Vec&amp;lt;Foo&amp;gt;&lt;/code&gt; с
помощью &lt;code class=&quot;highlighter-rouge&quot;&gt;FooIdx&lt;/code&gt; напрямую:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;direct_indexing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FooIdx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Реализация выглядит так:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ops&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;impl&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ops&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FooIdx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FooIdx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h1 id=&quot;posliedovatielnost&quot;&gt;Последовательность&lt;/h1&gt;

&lt;p&gt;Интересно разобраться, почему эта реализация вообще разрешена языком.
В Rust типы, типажи и реализации разделены.
Это создает проблемы: что если есть два блока &lt;code class=&quot;highlighter-rouge&quot;&gt;impl&lt;/code&gt; для данной пары (типаж, тип)?
Очевидный выбор - запретить иметь два &lt;code class=&quot;highlighter-rouge&quot;&gt;impls&lt;/code&gt;, и это именно, то что делает Rust.&lt;/p&gt;

&lt;p&gt;На самом деле сложно соблюдать это ограничение! Самое простое правило
“ошибка, если набор пакетов содержит повторяющиеся &lt;code class=&quot;highlighter-rouge&quot;&gt;impls&lt;/code&gt;”
имеет серьезные недостатки. Прежде всего, это глобальная проверка, которая
требуется знание всех скомпилированных пакетов. Эта проверка откладывается
до более поздних стадий компиляции. Эта проблема также создает проблемы с зависимостями,
потому что два совершенно несвязанных пакета могут не
компилироваться, если одновременно присутствует &lt;code class=&quot;highlighter-rouge&quot;&gt;impl&lt;/code&gt; для пары (типаж, тип).
Более того, компилятор сам не решит проблему, т. к. у него нет всей информации обо всех пакетах.
Например, можно загрузить дополнительный код во время выполнения через динамические библиотеки
и могут произойти всякие плохие штуки, если ваша программа и динамическая библиотека содержат дублирующиеся реализации.&lt;/p&gt;

&lt;p&gt;Для того чтобы свободно комбинировать пакеты, мы хотим гораздо более сильное свойство:
не только текущее множество скомпилированных пакетов, но и все существующие и
даже будущие пакеты не должны нарушать ограничение на одну реализацию типажа.
Как это в дальнейшем проверить?
При публикации пакета на &lt;code class=&quot;highlighter-rouge&quot;&gt;crates.io&lt;/code&gt; через &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo publish&lt;/code&gt; должно выдаваться предупреждение
о конфликте реализации &lt;code class=&quot;highlighter-rouge&quot;&gt;impl&lt;/code&gt; для пары (типаж, тип) с уже опубликованными пакетами?&lt;/p&gt;

&lt;p&gt;К счастью, и это потрясающе красиво, можно нивелировать это всеобъемлющее свойство до локального.
В самом простом виде, мы может поместить ограничение, что &lt;code class=&quot;highlighter-rouge&quot;&gt;impl Foo for Bar&lt;/code&gt;
может появиться либо в пакете, который определяет &lt;code class=&quot;highlighter-rouge&quot;&gt;Foo&lt;/code&gt;, или в том, который определяет
&lt;code class=&quot;highlighter-rouge&quot;&gt;Bar&lt;/code&gt;. Важно то, какой из них определяет &lt;code class=&quot;highlighter-rouge&quot;&gt;impl&lt;/code&gt;, должен использовать другой,
что дает возможность обнаружить конфликт.&lt;/p&gt;

&lt;p&gt;Это все действительно изящно, но мы только что определили &lt;code class=&quot;highlighter-rouge&quot;&gt;Index&lt;/code&gt; для
&lt;code class=&quot;highlighter-rouge&quot;&gt;Vec&lt;/code&gt;, и оба - и &lt;code class=&quot;highlighter-rouge&quot;&gt;Index&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;Vec&lt;/code&gt; из стандартной библиотеки! Как
это возможно? Хитрость в том, что &lt;code class=&quot;highlighter-rouge&quot;&gt;Index&lt;/code&gt; имеет параметр типа:
&lt;code class=&quot;highlighter-rouge&quot;&gt;trait Index&amp;lt;Idx: ?Sized&amp;gt;&lt;/code&gt;. Это шаблон для типажа, и мы получаем
“реальный” типаж, когда мы подставляем параметр типа. Поскольку
&lt;code class=&quot;highlighter-rouge&quot;&gt;FooIdx&lt;/code&gt; является локальным типом, итоговый &lt;code class=&quot;highlighter-rouge&quot;&gt;Index&amp;lt;FromIdx&amp;gt;&lt;/code&gt; тоже
считается локальным. Точные правила здесь довольно сложны, &lt;a href=&quot;https://github.com/rust-lang/rfcs/pull/2451&quot;&gt;RFC&lt;/a&gt;
объясняет их довольно хорошо.&lt;/p&gt;

&lt;h1 id=&quot;bolshie-impls&quot;&gt;Больше impls&lt;/h1&gt;

&lt;p&gt;Поскольку &lt;code class=&quot;highlighter-rouge&quot;&gt;Index&amp;lt;FooIdx&amp;gt;&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;Index&amp;lt;BarIdx&amp;gt;&lt;/code&gt; разные типажи, один
тип может реализовать их оба. Это удобно для контейнеров
которые содержат различные типы:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Arena&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;foos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;bars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Bar&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;impl&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ops&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FooIdx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Arena&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;impl&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ops&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BarIdx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Arena&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Также полезно определить арифметические операции и преобразования для
новых типизированных индексов.
Я собрал &lt;a href=&quot;https://crates.io/crates/typed_index_derive&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;typed_index_derive&lt;/code&gt;&lt;/a&gt;, чтобы автоматизировать этот шаблон через
процедурный макрос, конечный результат выглядит следующим образом:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;macro_use&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;typed_index_derive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Spam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#[derive(&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Обычно выводит типичные типажи для структур&lt;/span&gt;
    &lt;span class=&quot;cp&quot;&gt;Debug,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Copy,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Clone,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Ord,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;PartialOrd,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Eq,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;PartialEq,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;Hash,&lt;/span&gt;

    &lt;span class=&quot;cp&quot;&gt;TypedIndex&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#[typed_index(Spam)]&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// индексирует `&amp;amp;[Spam]`&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SpamIdx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;usize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// может быть `u32` вместо `usize`&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;spams&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;vec!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Spam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.into&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()),&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Spam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.into&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()),&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Spam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;baz&quot;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.into&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())];&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Преобразования между `usize` и `SpamIdx`&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SpamIdx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.into&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;usize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Индексирование `Vec&amp;lt;Spam&amp;gt;` с помощью `SpamIdx`, `IndexMut` тоже работает&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;.&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Индексировать `Vec&amp;lt;usize&amp;gt;` нельзя, как и задумывалось&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// vec![1, 2, 3][idx]&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// error: slice indices are of type `usize` or ranges of `usize`&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Можно прибавлять `usize` или вычитать его из индекса&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;.&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Разность между двумя индексами выраженная через `usize`&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0u&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Обсуждение &lt;a href=&quot;https://www.reddit.com/r/rust/comments/8ohaj4/blog_post_newtype_index_pattern/&quot;&gt;/r/rust&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Tue, 26 Mar 2019 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B0/2019/03/26/newtype-index-pattern.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B0/2019/03/26/newtype-index-pattern.html</guid>
        
        
        <category>руководства</category>
        
      </item>
    
      <item>
        <title>Выпуск Rust 1.33.0</title>
        <description>&lt;p&gt;Команда разработчиков Rust рада сообщить о выпуске новой версии Rust, 1.33.0.
Rust — это язык программирования, который дает возможность каждому
создавать надежное и эффективное программное обеспечение.&lt;/p&gt;

&lt;p&gt;Если у вас установлена предыдущая версия Rust с помощью &lt;code class=&quot;highlighter-rouge&quot;&gt;rustup&lt;/code&gt;, то для обновления
Rust до версии 1.33.0 вам достаточно выполнить:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;rustup update stable
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если у вас еще не установлен &lt;code class=&quot;highlighter-rouge&quot;&gt;rustup&lt;/code&gt;, вы можете &lt;a href=&quot;https://www.rust-lang.org/install.html&quot;&gt;установить его&lt;/a&gt; с соответствующей
страницы нашего веб-сайта. С &lt;a href=&quot;https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1330-2019-02-28&quot;&gt;подробными примечаниями к выпуску Rust 1.33.0&lt;/a&gt;
можно ознакомиться на GitHub.&lt;/p&gt;

&lt;h2 id=&quot;chto-voshlo-v-stabilnuiu-viersiiu-1330&quot;&gt;Что вошло в стабильную версию 1.33.0&lt;/h2&gt;

&lt;p&gt;Основные улучшения этого выпуска: значительное расширение возможностей &lt;code class=&quot;highlighter-rouge&quot;&gt;const fn&lt;/code&gt;
и стабилизация нового Pin API.&lt;/p&gt;

&lt;h3 id=&quot;rasshirieniie-vozmozhnostiei-const-fn&quot;&gt;Расширение возможностей &lt;code class=&quot;highlighter-rouge&quot;&gt;const fn&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;const fn&lt;/code&gt; &lt;a href=&quot;https://github.com/rust-lang/rust/pull/57175&quot;&gt;теперь умеет гораздо больше&lt;/a&gt;,
а именно:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;неопровержимое (irrefutable) сопоставление с образцом
(например, &lt;code class=&quot;highlighter-rouge&quot;&gt;const fn foo((x, y): (u8, u8)) { ... }&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;let&lt;/code&gt; привязки (например, &lt;code class=&quot;highlighter-rouge&quot;&gt;let x = 1;&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;изменяемые &lt;code class=&quot;highlighter-rouge&quot;&gt;let&lt;/code&gt; привязки (например, &lt;code class=&quot;highlighter-rouge&quot;&gt;let mut x = 1;&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;выражения присваивания (например &lt;code class=&quot;highlighter-rouge&quot;&gt;x = y&lt;/code&gt;)
и операторов присваивания (например, &lt;code class=&quot;highlighter-rouge&quot;&gt;x += y&lt;/code&gt;),
включая присваивание проекциям
(например, полю структуры или результату оператора индексирования - &lt;code class=&quot;highlighter-rouge&quot;&gt;x[3] = 42&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;инструкции выражений (expression statements) (например, &lt;code class=&quot;highlighter-rouge&quot;&gt;3;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;p&gt;Еще &lt;a href=&quot;https://github.com/rust-lang/rust/pull/57067&quot;&gt;теперь можно вызывать “const unsafe fn” из “const fn”&lt;/a&gt;,
например:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;i32&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;i32&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Благодаря этим улучшениям стало возможным объявить константными
большое количество функций стандартной библиотеки.
Они перечислены ниже в библиотечной секции.&lt;/p&gt;

&lt;h3 id=&quot;pin-api&quot;&gt;Pin API&lt;/h3&gt;

&lt;p&gt;Данный выпуск привносит в язык новый механизм, представленный
&lt;a href=&quot;https://doc.rust-lang.org/std/pin/struct.Pin.html&quot;&gt;типом &lt;code class=&quot;highlighter-rouge&quot;&gt;std::pin::Pin&amp;lt;P&amp;gt;&lt;/code&gt;&lt;/a&gt;
и &lt;a href=&quot;https://doc.rust-lang.org/std/marker/trait.Unpin.html&quot;&gt;маркерным типажом &lt;code class=&quot;highlighter-rouge&quot;&gt;Unpin&lt;/code&gt;&lt;/a&gt;.
Основная идея подробно описана &lt;a href=&quot;https://doc.rust-lang.org/std/pin/index.html&quot;&gt;в документации “std::pin” модуля&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Иногда может быть полезно запретить перемещение объекта,
т.е. гарантировать неизменность его адреса в памяти.
Основным сценарием использования такой возможности являются
самоссылающиеся структуры,
поскольку перемещение таких объектов приведет к инвалидации указателей,
что может привести к неопределенному поведению (UB).&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Pin&amp;lt;P&amp;gt;&lt;/code&gt; гарантирует, что объект, на который ссылается любой указатель типа &lt;code class=&quot;highlighter-rouge&quot;&gt;P&lt;/code&gt;,
имеет неизменное расположение в памяти, т.е. он не может быть перемещен
и его память не может быть освобождена.
Такие значения называются “закрепленными” (“pinned”).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ожидается, что этот механизм будет использоваться в основном авторами библиотек,
поэтому мы сейчас не станем погружаться глубже в детали
(с которыми можно ознакомиться в документации по ссылке выше).
Однако, стабилизация этого API является важным событием для всех пользователей Rust,
потому что является ключевым этапом на пути к очень ожидаемому &lt;code class=&quot;highlighter-rouge&quot;&gt;async&lt;/code&gt;/&lt;code class=&quot;highlighter-rouge&quot;&gt;await&lt;/code&gt;.
За статусом оставшейся работы в этом направлении можно следить
на &lt;a href=&quot;https://areweasyncyet.rs/&quot;&gt;areweasyncyet.rs&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;importirovat-kak-&quot;&gt;Импортировать как &lt;code class=&quot;highlighter-rouge&quot;&gt;_&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/pull/56303&quot;&gt;Теперь можно импортировать сущности как &lt;code class=&quot;highlighter-rouge&quot;&gt;_&lt;/code&gt;&lt;/a&gt;.
Это позволяет импортировать реализации типажа без занесения его
имени в текущее пространство имен, например:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Read&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Тут не возникнет конфликта имен:&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;trait&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Read&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1330-2019-02-28&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;stabilizatsiia-standartnoi-bibliotieki&quot;&gt;Стабилизация стандартной библиотеки&lt;/h3&gt;

&lt;p&gt;Вот список всего, что стало константным:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/pull/57566&quot;&gt;Методы &lt;code class=&quot;highlighter-rouge&quot;&gt;overflowing_{add, sub, mul, shl, shr}&lt;/code&gt; всех численных типов теперь константны.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/pull/57105&quot;&gt;Методы &lt;code class=&quot;highlighter-rouge&quot;&gt;rotate_left&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;rotate_right&lt;/code&gt;, и &lt;code class=&quot;highlighter-rouge&quot;&gt;wrapping_{add, sub, mul, shl, shr}&lt;/code&gt;
всех численных типов теперь константны.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/pull/57105&quot;&gt;Методы &lt;code class=&quot;highlighter-rouge&quot;&gt;is_positive&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;is_negative&lt;/code&gt; всех знаковых численных типов теперь константны.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/pull/57167&quot;&gt;Метод &lt;code class=&quot;highlighter-rouge&quot;&gt;get&lt;/code&gt; всех &lt;code class=&quot;highlighter-rouge&quot;&gt;NonZero&lt;/code&gt; типов теперь константен.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/pull/57234&quot;&gt;Методы &lt;code class=&quot;highlighter-rouge&quot;&gt;count_ones&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;count_zeros&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;leading_zeros&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;trailing_zeros&lt;/code&gt;,
&lt;code class=&quot;highlighter-rouge&quot;&gt;swap_bytes&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;from_be&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;from_le&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;to_be&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;to_le&lt;/code&gt;
всех числовых типов теперь константны.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/pull/57234&quot;&gt;Метод &lt;code class=&quot;highlighter-rouge&quot;&gt;Ipv4Addr::new&lt;/code&gt; теперь константен.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Кроме того, стабилизированы следующие API:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.read_exact_at&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;unix::FileExt::read_exact_at&lt;/code&gt;&lt;/a&gt;
и &lt;a href=&quot;https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.write_all_at&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;unix::FileExt::write_all_at&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/option/enum.Option.html#method.transpose&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Option::transpose&lt;/code&gt;&lt;/a&gt;
и &lt;a href=&quot;https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Result::transpose&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/convert/fn.identity.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;convert::identity&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Вышеупомянутые &lt;a href=&quot;https://doc.rust-lang.org/std/pin/struct.Pin.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;pin::Pin&lt;/code&gt;&lt;/a&gt;
и &lt;a href=&quot;https://doc.rust-lang.org/stable/std/marker/trait.Unpin.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;marker::Unpin&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/nightly/std/marker/struct.PhantomPinned.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;marker::PhantomPinned&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/vec/struct.Vec.html#method.resize_with&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Vec::resize_with&lt;/code&gt;&lt;/a&gt;
и &lt;a href=&quot;https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.resize_with&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;VecDeque::resize_with&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_millis&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Duration::as_millis&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_micros&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Duration::as_micros&lt;/code&gt;&lt;/a&gt;,
и &lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_nanos&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Duration::as_nanos&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1330-2019-02-28&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;uluchshieniia-v-cargo&quot;&gt;Улучшения в Cargo&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/rust-lang/cargo/pull/6484&quot;&gt;Теперь cargo пересобирает крейт, если какой-то из его файлов был изменен
во время изначальной сборки.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1330-2019-02-28&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;cratesio&quot;&gt;Crates.io&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://users.rust-lang.org/t/a-verified-email-address-will-be-required-to-publish-to-crates-io-starting-on-2019-02-28/22425&quot;&gt;Как было объявлено ранее&lt;/a&gt;, начиная с этого выпуска crates.io
будет требовать подтверждения почтового адреса для публикации крейтов.
Начиная с 2019-03-01 00:00 UTC выполнение &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo publish&lt;/code&gt; будет завершаться
с ошибкой для учетных записей без подтвержденной почты.&lt;/p&gt;

&lt;p&gt;Это необходимо для соответствия требованиям &lt;a href=&quot;https://ru.wikipedia.org/wiki/Digital_Millennium_Copyright_Act&quot;&gt;DMCA&lt;/a&gt;.
Если вы не заметили предупреждений об этом, которые cargo писал в последних выпусках,
зайдите в &lt;a href=&quot;https://crates.io/me&quot;&gt;crates.io/me&lt;/a&gt; для указания и подтверждения вашей почты.
Данный почтовый адрес никогда не будет опубликован и будет использован
исключительно для непосредственного функционала crates.io.&lt;/p&gt;

&lt;h2 id=&quot;razrabotchiki-1330&quot;&gt;Разработчики 1.33.0&lt;/h2&gt;

&lt;p&gt;Множество людей совместно создавало Rust 1.33. Мы не смогли бы
завершить работу без участия каждого из вас.
&lt;a href=&quot;https://thanks.rust-lang.org/rust/1.33.0&quot;&gt;Спасибо!&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 28 Feb 2019 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2019/02/28/rust-1.33.0.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2019/02/28/rust-1.33.0.html</guid>
        
        
        <category>новости</category>
        
      </item>
    
      <item>
        <title>Митап Parity Technologes в Москве 16 декабря</title>
        <description>&lt;p&gt;Всем привет!&lt;/p&gt;

&lt;p&gt;В грядущее воскресенье (16 декабря) Parity Technologes организует митап в Москве, приуроченный к конференции &lt;a href=&quot;https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/11/09/rustrush-2018.html&quot;&gt;RustRush&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;От команды Parity на RustRush приезжает с десяток человек; на митапе Пьер Кригер (&lt;a href=&quot;https://github.com/tomaka&quot;&gt;@tomaka&lt;/a&gt;) будет рассказывать про &lt;a href=&quot;https://github.com/libp2p/rust-libp2p/&quot;&gt;rust-libp2p&lt;/a&gt;, а Джек Френшем (&lt;a href=&quot;https://github.com/Vurich&quot;&gt;@Vurich&lt;/a&gt;) — про &lt;a href=&quot;https://github.com/paritytech/substrate&quot;&gt;Parity Substrate&lt;/a&gt;.
Доклады будут на английском, но мы поможем с переводом, если вам будет проще формулировать вопросы по-русски.&lt;/p&gt;

&lt;p&gt;Митап пройдёт в помещении коворкинга “Ключ Трёхгорка” по адресу: Рочдельская 15, стр. 17–18, 3 этаж (ближайшее метро - “Улица 1095 года”). Начало — в 18:00.&lt;/p&gt;

&lt;p&gt;Вход бесплатный, но надо заранее зарегистрироваться &lt;a href=&quot;https://www.meetup.com/paritytech-moscow/events/256838073/&quot;&gt;на странице митапа&lt;/a&gt;, чтобы мы знали на сколько человек готовить зал и заказывать еду и напитки.&lt;/p&gt;

&lt;p&gt;Записывайтесь и приходите!&lt;/p&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;
</description>
        <pubDate>Mon, 10 Dec 2018 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/12/10/parity-meetup.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/12/10/parity-meetup.html</guid>
        
        <category>эксклюзивы</category>
        
        
        <category>новости</category>
        
      </item>
    
      <item>
        <title>Выпуск Rust 1.31 и Rust 2018</title>
        <description>&lt;p&gt;Команда разработчиков Rust рада сообщить о выпуске новой версии Rust, 1.31.0, а
также “Rust 2018”. Rust - это язык программирования, который дает возможность каждому
создавать надежное и эффективное программное обеспечение.&lt;/p&gt;

&lt;p&gt;Если у вас установлена предыдущая версия Rust с помощью &lt;code class=&quot;highlighter-rouge&quot;&gt;rustup&lt;/code&gt;, то для обновления
Rust до версии 1.31.0 вам достаточно выполнить:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;rustup update stable
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если у вас еще не установлен &lt;code class=&quot;highlighter-rouge&quot;&gt;rustup&lt;/code&gt;, вы можете &lt;a href=&quot;https://www.rust-lang.org/tools/install&quot;&gt;установить его&lt;/a&gt; с соответствующей
страницы нашего веб-сайта. С &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1310-2018-12-06&quot;&gt;подробными примечаниями к выпуску Rust 1.31.0&lt;/a&gt;
можно ознакомиться на GitHub.&lt;/p&gt;

&lt;h2 id=&quot;chto-voshlo-v-stabilnuiu-viersiiu-1310&quot;&gt;Что вошло в стабильную версию 1.31.0&lt;/h2&gt;

&lt;p&gt;Rust 1.31, возможно, самый значительный выпуск со времен Rust 1.0! В данный выпуск включена
первая итерация «Rust 2018», но это не единственное нововведение! Обзор улучшений будет длинный,
поэтому вот оглавление:&lt;/p&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#chto-voshlo-v-stabilnuiu-viersiiu-1310&quot; id=&quot;markdown-toc-chto-voshlo-v-stabilnuiu-viersiiu-1310&quot;&gt;Что вошло в стабильную версию 1.31.0&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#rust-2018&quot; id=&quot;markdown-toc-rust-2018&quot;&gt;Rust 2018&lt;/a&gt;        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#nielieksichieskiie-vriemiena-zhizni&quot; id=&quot;markdown-toc-nielieksichieskiie-vriemiena-zhizni&quot;&gt;Нелексические времена жизни&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;#izmienieniia-sistiemy-moduliei&quot; id=&quot;markdown-toc-izmienieniia-sistiemy-moduliei&quot;&gt;Изменения системы модулей&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#dopolnitielnyie-pravila-vyvoda-vriemien-zhizni&quot; id=&quot;markdown-toc-dopolnitielnyie-pravila-vyvoda-vriemien-zhizni&quot;&gt;Дополнительные правила вывода времен жизни&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#const-fn&quot; id=&quot;markdown-toc-const-fn&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;const fn&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#novyie-instrumienty&quot; id=&quot;markdown-toc-novyie-instrumienty&quot;&gt;Новые инструменты&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#instrumientalnyie-provierki-kachiestva-koda-tool-lints&quot; id=&quot;markdown-toc-instrumientalnyie-provierki-kachiestva-koda-tool-lints&quot;&gt;Инструментальные проверки качества кода (tool lints)&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#dokumientatsiia&quot; id=&quot;markdown-toc-dokumientatsiia&quot;&gt;Документация&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#priedmietnyie-rabochiie-ghruppy&quot; id=&quot;markdown-toc-priedmietnyie-rabochiie-ghruppy&quot;&gt;Предметные рабочие группы&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#novyi-vieb-sait&quot; id=&quot;markdown-toc-novyi-vieb-sait&quot;&gt;Новый веб-сайт&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#stabilizatsiia-standartnoi-bibliotieki&quot; id=&quot;markdown-toc-stabilizatsiia-standartnoi-bibliotieki&quot;&gt;Стабилизация стандартной библиотеки&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#uluchshieniia-v-cargo&quot; id=&quot;markdown-toc-uluchshieniia-v-cargo&quot;&gt;Улучшения в Cargo&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#razrabotchiki-1310&quot; id=&quot;markdown-toc-razrabotchiki-1310&quot;&gt;Разработчики 1.31.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;h3 id=&quot;rust-2018&quot;&gt;Rust 2018&lt;/h3&gt;

&lt;p&gt;Мы писали о Rust 2018 &lt;a href=&quot;https://blog.rust-lang.org/2018/03/12/roadmap.html&quot;&gt;впервые в марте&lt;/a&gt;,
и затем &lt;a href=&quot;https://blog.rust-lang.org/2018/07/27/what-is-rust-2018.html&quot;&gt;в июле&lt;/a&gt;.
За подробностями &lt;em&gt;зачем&lt;/em&gt; нужен Rust 2018, обратитесь к этим публикациям. В данном
обзоре нам и так много что нужно рассказать, поэтому мы сосредоточимся только на том,
&lt;em&gt;что&lt;/em&gt; такое Rust 2018. Также об этом можно почитать &lt;a href=&quot;https://hacks.mozilla.org/2018/12/rust-2018-is-here/&quot;&gt;в посте на Mozilla Hacks&lt;/a&gt;
(&lt;a href=&quot;https://habr.com/post/432564/&quot;&gt;перевод&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Вкратце, Rust 2018 - это возможность объединить в связное целое всю работу,
которую мы проделали за последние три года. Rust 2018 - это нечто большее,
чем просто набор улучшений языка. В дополнении к ним, он включает:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Инструментарий (поддержка в IDE, &lt;code class=&quot;highlighter-rouge&quot;&gt;rustfmt&lt;/code&gt;, Clippy)&lt;/li&gt;
  &lt;li&gt;Документацию&lt;/li&gt;
  &lt;li&gt;Работу предметных рабочих групп&lt;/li&gt;
  &lt;li&gt;Новый веб-сайт&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Дальше мы расскажем обо всем этом подробнее и о других нововведениях.&lt;/p&gt;

&lt;p&gt;Давайте создадим новый проект с помощью Cargo:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;w&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;cargo&lt;/span&gt;&lt;span class=&quot;kv&quot;&gt; new foo
&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Вот содержимое &lt;code class=&quot;highlighter-rouge&quot;&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-toml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nn&quot;&gt;[package]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;foo&quot;&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;0.1.0&quot;&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;authors&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Your Name &amp;lt;you@example.com&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;edition&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;2018&quot;&lt;/span&gt;

&lt;span class=&quot;nn&quot;&gt;[dependencies]&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В секцию &lt;code class=&quot;highlighter-rouge&quot;&gt;[package]&lt;/code&gt; был добавлен новый ключ: &lt;code class=&quot;highlighter-rouge&quot;&gt;edition&lt;/code&gt;. Обратите внимание,
что он установлен в &lt;code class=&quot;highlighter-rouge&quot;&gt;2018&lt;/code&gt;. Вы также можете установить его в &lt;code class=&quot;highlighter-rouge&quot;&gt;2015&lt;/code&gt; - это
значение будет установлено по умолчанию, если ключ отсутствует.&lt;/p&gt;

&lt;p&gt;С использованием Rust 2018 будут разблокированы некоторые новые возможности,
которые не разрешены в Rust 2015.&lt;/p&gt;

&lt;p&gt;Важно отметить, что каждый пакет может быть в режиме 2015 или 2018, и они
будут работать вместе. Ваш проект 2018 редакции может использовать зависимости
2015 редакции, а проект 2015 редакции может использовать зависимости 2018
редакции. Это гарантирует целостность экосистемы и что все новые возможности
будут опциональны, сохраняя совместимость с существующим кодом.
Кроме того, когда вы решите перенести код Rust 2015 на Rust 2018, изменения
могут быть внесены автоматически через &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fix&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Вы можете спросить: а что с самими новыми возможностями? Во-первых, они
добавляются также и в Rust 2015, если оказываются совместимы с особенностями
этой редакции. Таким образом, большая часть языка остается одинаковой везде.
Вы можете посмотреть &lt;a href=&quot;https://doc.rust-lang.org/edition-guide&quot;&gt;руководство по редакциям&lt;/a&gt;,
чтобы узнать минимальную версию &lt;code class=&quot;highlighter-rouge&quot;&gt;rustc&lt;/code&gt; для каждой новой возможности и
другие ее требования. Однако, есть несколько больших нововведений, о
которых нужно упомянуть отдельно: нелексические времена жизни и некоторые
изменения в системе модулей.&lt;/p&gt;

&lt;h4 id=&quot;nielieksichieskiie-vriemiena-zhizni&quot;&gt;Нелексические времена жизни&lt;/h4&gt;

&lt;p&gt;Если вы следили за развитием Rust последние несколько лет, то вы могли
время от времени встречать термин “NLL” или “нелексические времена жизни”
(“non-lexical lifetimes”). Это - жаргонизм, который, если говорить простыми
словами, означает: анализатор заимствований стал умнее и теперь принимает
некоторый корректный код, который до этого отклонял. Рассмотрим пример:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Раньше Rust выдавал ошибку компиляции:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
 --&amp;gt; src/main.rs:5:18
  |
4 |     let y = &amp;amp;x;
  |              - immutable borrow occurs here
5 |     
6 |     let z = &amp;amp;mut x;
  |                  ^ mutable borrow occurs here
7 | }
  | - immutable borrow ends here
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Это потому, что область жизни ссылок определялась “лексически”; то есть,
заимствование &lt;code class=&quot;highlighter-rouge&quot;&gt;y&lt;/code&gt; считалось активным, пока &lt;code class=&quot;highlighter-rouge&quot;&gt;y&lt;/code&gt; не выйдет из области видимости
в конце &lt;code class=&quot;highlighter-rouge&quot;&gt;main&lt;/code&gt;, даже если мы никогда больше не используем &lt;code class=&quot;highlighter-rouge&quot;&gt;y&lt;/code&gt; внутри области.
С кодом выше все в порядке, но анализатор зависимостей не мог этого понять.&lt;/p&gt;

&lt;p&gt;Теперь этот код замечательно компилируется.&lt;/p&gt;

&lt;p&gt;Но что, если бы мы использовали &lt;code class=&quot;highlighter-rouge&quot;&gt;y&lt;/code&gt;? Например так:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;nd&quot;&gt;println!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;y: {}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Раньше Rust выдавал вам такую ошибку:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
 --&amp;gt; src/main.rs:5:18
  |
4 |     let y = &amp;amp;x;
  |              - immutable borrow occurs here
5 |     let z = &amp;amp;mut x;
  |                  ^ mutable borrow occurs here
...
8 | }
  | - immutable borrow ends here
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В Rust 2018 это сообщение об ошибке улучшилось:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
 --&amp;gt; src/main.rs:5:13
  |
4 |     let y = &amp;amp;x;
  |             -- immutable borrow occurs here
5 |     let z = &amp;amp;mut x;
  |             ^^^^^^ mutable borrow occurs here
6 |     
7 |     println!(&quot;y: {}&quot;, y);
  |                       - borrow later used here
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Вместо того, чтобы указывать, где &lt;code class=&quot;highlighter-rouge&quot;&gt;y&lt;/code&gt; выходит из области видимости, оно
показывает, где происходит конфликтное заимствование. Это значительно
упрощает отладку ошибок такого рода.&lt;/p&gt;

&lt;p&gt;В Rust 1.31 это улучшение исключительно для Rust 2018. Мы планируем добавить
его в Rust 2015 позже.&lt;/p&gt;

&lt;h4 id=&quot;izmienieniia-sistiemy-moduliei&quot;&gt;Изменения системы модулей&lt;/h4&gt;

&lt;p&gt;Система модулей может вызывать затруднения у людей, впервые изучающих
Rust. Конечно, всегда есть что-то, для освоения чего требуется время.
Но главная причина того, почему модули так смущают многих - несмотря
на простые и последовательные правила, определяющие систему
модулей, последствия их применения могут казаться противоречивыми,
загадочными и противоестественными.&lt;/p&gt;

&lt;p&gt;Поэтому редакция 2018 вносит некоторые изменения в то, как работают
пути, упрощая систему модулей и делая ее понятнее.&lt;/p&gt;

&lt;p&gt;Вот краткое резюме:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;extern crate&lt;/code&gt; больше не требуется практически нигде.&lt;/li&gt;
  &lt;li&gt;Вы можете импортировать макросы с помощью &lt;code class=&quot;highlighter-rouge&quot;&gt;use&lt;/code&gt;, вместо использования атрибута &lt;code class=&quot;highlighter-rouge&quot;&gt;#[macro_use]&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Абсолютные пути начинаются с имени контейнера, где ключевое слово &lt;code class=&quot;highlighter-rouge&quot;&gt;crate&lt;/code&gt; относится к текущему контейнеру.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;foo.rs&lt;/code&gt; и поддиректория &lt;code class=&quot;highlighter-rouge&quot;&gt;foo/&lt;/code&gt; могут сосуществовать; &lt;code class=&quot;highlighter-rouge&quot;&gt;mod.rs&lt;/code&gt; больше не требуется при размещении подмодулей в поддиректории.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Это выглядит как произвольный набор правил, но в целом ментальная модель
теперь значительно упростилась.&lt;/p&gt;

&lt;p&gt;Тут еще &lt;em&gt;много&lt;/em&gt; деталей, пожалуйста, обратитесь к &lt;a href=&quot;https://doc.rust-lang.org/edition-guide/rust-2018/module-system/path-clarity.html&quot;&gt;руководству по
редакциям&lt;/a&gt;
за выяснением всех подробностей.&lt;/p&gt;

&lt;h3 id=&quot;dopolnitielnyie-pravila-vyvoda-vriemien-zhizni&quot;&gt;Дополнительные правила вывода времен жизни&lt;/h3&gt;

&lt;p&gt;Давайте поговорим об улучшении, доступном в обоих редакциях: мы
добавили некоторые дополнительные правила вывода для блоков &lt;code class=&quot;highlighter-rouge&quot;&gt;impl&lt;/code&gt;
и определений функций. Код вроде такого:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;impl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Reader&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BufReader&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// здесь методы&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;может быть теперь записан так:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;impl&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Reader&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BufReader&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// здесь методы&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Время жизни &lt;code class=&quot;highlighter-rouge&quot;&gt;'_&lt;/code&gt; по-прежнему показывает, что&lt;code class=&quot;highlighter-rouge&quot;&gt; BufReader&lt;/code&gt; принимает его как
параметр, но нам больше не нужно задавать для него имя.&lt;/p&gt;

&lt;p&gt;Времена жизни все еще требуется определять в структурах. Однако нам больше
не нужно писать столько шаблонного кода, как раньше:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// Rust 2015&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Ref&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Rust 2018&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Ref&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Зависимость &lt;code class=&quot;highlighter-rouge&quot;&gt;: 'a&lt;/code&gt; будет выведена. Вы все еще можете указать ее явно, если
хотите. Мы рассматриваем и другие возможности для вывода в подобных местах
на будущее, но пока не имеем конкретных планов.&lt;/p&gt;

&lt;h3 id=&quot;const-fn&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;const fn&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;В Rust есть несколько способов объявления функции: &lt;code class=&quot;highlighter-rouge&quot;&gt;fn&lt;/code&gt; для обычных функций,
&lt;code class=&quot;highlighter-rouge&quot;&gt;unsafe fn&lt;/code&gt; для небезопасных функций и &lt;code class=&quot;highlighter-rouge&quot;&gt;extern fn&lt;/code&gt; для внешних функций.
В этом выпуске добавлен новый способ объявления функции: &lt;code class=&quot;highlighter-rouge&quot;&gt;const fn&lt;/code&gt;. Он
используется так:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;i32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;i32&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Константная функция может вызываться как обычная функция, но помимо этого
она может использоваться в любом константном контексте. При этом она
выполнится во время компиляции, а не во время выполнения программы. Например:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SIX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;i32&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Функция &lt;code class=&quot;highlighter-rouge&quot;&gt;foo&lt;/code&gt; выполнится во время компиляции и &lt;code class=&quot;highlighter-rouge&quot;&gt;SIX&lt;/code&gt; примет значение &lt;code class=&quot;highlighter-rouge&quot;&gt;6&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Константные функции не могут делать все то, что могут делать нормальные функции:
они должны иметь детерминированный результат. Это важно из соображений
надежности. В текущем виде константные функции могут совершать минимальное
подмножество операций. Вот некоторые примеры того, что вы можете в них делать:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Использовать целочисленные арифметические операции и операции сравнения&lt;/li&gt;
  &lt;li&gt;Использовать любые логические операции, кроме &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;amp;&amp;amp;&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;||&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Конструировать массивы, структуры, перечисления и кортежи&lt;/li&gt;
  &lt;li&gt;Вызывать другие константные функции&lt;/li&gt;
  &lt;li&gt;Обращаться по индексу в массивах и срезах&lt;/li&gt;
  &lt;li&gt;Обращаться к полям структур и кортежей&lt;/li&gt;
  &lt;li&gt;Использовать константы (но не статические значения, и даже не ссылки на них)&lt;/li&gt;
  &lt;li&gt;Использовать &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;amp;&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;*&lt;/code&gt; ссылки&lt;/li&gt;
  &lt;li&gt;Приводить типы, исключая приведение сырого указателя к целочисленному значению&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Мы будем расширять возможности константных функций, но приведенного
выше набора уже достаточно, чтобы использовать &lt;code class=&quot;highlighter-rouge&quot;&gt;const fn&lt;/code&gt; на практике.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://doc.rust-lang.org/reference/items/functions.html#const-functions&quot;&gt;в справочнике&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;novyie-instrumienty&quot;&gt;Новые инструменты&lt;/h3&gt;

&lt;p&gt;Редакция 2018 знаменует начало нового уровня зрелости экосистемы инструментов
Rust. Cargo, Rustdoc и Rustup были основными инструментами, начиная с версии
1.0; с редакцией 2018 приходит новое поколение инструментов, которыми теперь
все могут пользоваться: Clippy, Rustfmt и поддержка IDE.&lt;/p&gt;

&lt;p&gt;Статический анализатор кода &lt;a href=&quot;https://github.com/rust-lang/rust-clippy/&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;clippy&lt;/code&gt;&lt;/a&gt;
теперь доступен в стабильном Rust. Вы можете установить его через &lt;code class=&quot;highlighter-rouge&quot;&gt;rustup component
add clippy&lt;/code&gt; и запустить командой &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo clippy&lt;/code&gt;. Clippy теперь получил
версию 1.0 и имеет такие же гарантии стабильности статических проверок, что и rustc.
Новые проверки могут добавляться, или может расширяться функционал старых,
но старые не могут быть удалены (могут быть только помечены как устаревшие).
Это означает, что код, который компилируется с clippy, будет продолжать
компилироваться с clippy (при условии, что для проверок не задано генерировать
ошибку через &lt;code class=&quot;highlighter-rouge&quot;&gt;deny&lt;/code&gt;), но может выдавать новые предупреждения.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/rust-lang/rustfmt&quot;&gt;Rustfmt&lt;/a&gt; - это инструмент для форматирования
кода в Rust. Автоматическое форматирование кода позволит вам сэкономить время,
кроме того, оно приблизит ваш код к &lt;a href=&quot;https://github.com/rust-lang/rfcs/blob/master/style-guide/README.md&quot;&gt;официальному стилю
Rust&lt;/a&gt;.
Вы можете установить его через &lt;code class=&quot;highlighter-rouge&quot;&gt;rustup component add rustfmt&lt;/code&gt; и использовать
командой &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fmt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Текущий выпуск включает Rustfmt 1.0. Отныне мы гарантируем обратную
совместимость для Rustfmt: если вы отформатируете свой код сегодня,
то форматирование не изменится в будущем (только для параметров по
умолчанию). Обратная совместимость означает, что теперь практично
запускать Rustfmt на вашем CI (используйте &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fmt --check&lt;/code&gt;).
Попробуйте это вместе с “форматированием при сохранении” в редакторе,
и ваш рабочий процесс революционизируется.&lt;/p&gt;

&lt;p&gt;Поддержка IDE - одна из самых востребованных возможностей инструментов
для Rust. Сейчас имеется несколько решений высокого качества:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=rust-lang.rust&quot;&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://plugins.jetbrains.com/plugin/8182-rust&quot;&gt;IntelliJ&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang-nursery/atom-ide-rust&quot;&gt;Atom&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/rust-enhanced&quot;&gt;Sublime Text 3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.eclipse.org/downloads/packages/release/photon/r/eclipse-ide-rust-developers-includes-incubating-components&quot;&gt;Eclipse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Работа по поддержке в IDE не закончена. В частности, автодополнение кода
в редакторах, основанных на RLS, не на высоте. Однако, если вы в основном
хотите поддержку типов, документации и “перехода к определению”, то вы
останетесь довольны.&lt;/p&gt;

&lt;h3 id=&quot;instrumientalnyie-provierki-kachiestva-koda-tool-lints&quot;&gt;Инструментальные проверки качества кода (tool lints)&lt;/h3&gt;

&lt;p&gt;В &lt;a href=&quot;https://blog.rust-lang.org/2018/10/25/Rust-1.30.0.html&quot;&gt;Rust 1.30&lt;/a&gt; мы
стабилизировали “инструментальные атрибуты”, такие как &lt;code class=&quot;highlighter-rouge&quot;&gt;#[rustfmt::skip]&lt;/code&gt;.
В Rust 1.31 мы стабилизировали нечто подобное: “инструментальные проверки
качества кода” (“tool lints”), такие как &lt;code class=&quot;highlighter-rouge&quot;&gt;#[allow(clippy::bool_comparison)]&lt;/code&gt;.
Это позволяет задавать пространства имен для проверок, чтобы стало понятнее,
из каких инструментов они берутся.&lt;/p&gt;

&lt;p&gt;Если вы ранее использовали проверки Clippy, вы можете выполнить миграцию
следующим образом:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// было&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cfg_attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;feature&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;cargo-clippy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;allow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bool_comparison&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))]&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// стало&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;allow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;clippy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bool_comparison&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Вам больше не нужен &lt;code class=&quot;highlighter-rouge&quot;&gt;cfg_attr&lt;/code&gt;! Вам также теперь будут выдаваться
предупреждения, которые помогут перейти на использование нового стиля.&lt;/p&gt;

&lt;h3 id=&quot;dokumientatsiia&quot;&gt;Документация&lt;/h3&gt;

&lt;p&gt;В Rustdoc было несколько улучшений в этом году, и была выпущена полностью 
переписанная книга “The Rust Programming Language”. Вы можете купить &lt;a href=&quot;https://nostarch.com/rust&quot;&gt;бумажную
копию от No Starch Press&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Раньше ее называли “вторым изданием” книги, но, так как она стала первым 
печатным изданием, то это вызвало путаницу. Ведь и печатное издание планируется 
периодически обновлять. В конце концов, после множества дискуссий с No Starch,
было решено обновлять книгу на веб-сайте вместе с каждым выпуском, 
а No Starch будет периодически забирать изменения и печатать их.
Книга довольно хорошо продается и собирает деньги для &lt;a href=&quot;http://www.blackgirlscode.com/&quot;&gt;Black Girls Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Вы можете найти новую версию книги &lt;a href=&quot;https://doc.rust-lang.org/beta/book/&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;priedmietnyie-rabochiie-ghruppy&quot;&gt;Предметные рабочие группы&lt;/h3&gt;

&lt;p&gt;В этом году мы объявили о создании четырех рабочих групп:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Сетевые сервисы&lt;/li&gt;
  &lt;li&gt;Приложения командной строки&lt;/li&gt;
  &lt;li&gt;WebAssembly&lt;/li&gt;
  &lt;li&gt;Встроенные устройства&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Группы очень усердно работали, чтобы сделать Rust лучше в 
каждой из этих областей. Вот некоторые достижения:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;В сетевых сервисах переработали интерфейс для Futures, а сверх этого еще и async/await. 
Эти улучшения еще не выпущены, но мы уже близки к этому!&lt;/li&gt;
  &lt;li&gt;Команда CLI работала над библиотеками и документацией, чтобы сделать приложения командной
строки лучше.&lt;/li&gt;
  &lt;li&gt;Группа WebAssembly выпустила множество инструментов мирового уровня для использования
Rust с wasm.&lt;/li&gt;
  &lt;li&gt;Для встроенных устройств появилась возможность вести разработку ARM на стабильном Rust!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Обо всем этом подробнее можно узнать на нашем новом сайте!&lt;/p&gt;

&lt;h3 id=&quot;novyi-vieb-sait&quot;&gt;Новый веб-сайт&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.rust-lang.org/2018/11/29/a-new-look-for-rust-lang-org.html&quot;&gt;На прошлой неделе&lt;/a&gt;
мы анонсировали новую версию нашего веб-сайта. Теперь она стала официальной
версией rust-lang.org!&lt;/p&gt;

&lt;p&gt;Для ее создания потребовался год работы многих людей. И хотя до полного завершения
еще многое нужно сделать, мы гордимся проделанной работой.&lt;/p&gt;

&lt;h3 id=&quot;stabilizatsiia-standartnoi-bibliotieki&quot;&gt;Стабилизация стандартной библиотеки&lt;/h3&gt;

&lt;p&gt;Были добавлены новые реализации &lt;code class=&quot;highlighter-rouge&quot;&gt;From&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;u8&lt;/code&gt; теперь реализует &lt;code class=&quot;highlighter-rouge&quot;&gt;From&amp;lt;NonZeroU8&amp;gt;&lt;/code&gt;, аналогично и для других числовых типов и их &lt;code class=&quot;highlighter-rouge&quot;&gt;NonZero&lt;/code&gt; эквивалентов&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Option&amp;lt;&amp;amp;T&amp;gt;&lt;/code&gt; реализует &lt;code class=&quot;highlighter-rouge&quot;&gt;From&amp;lt;&amp;amp;Option&amp;lt;T&amp;gt;&amp;gt;&lt;/code&gt;, аналогично и для &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;amp;mut&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Также были стабилизированы следующие функции:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.slice.html#method.align_to&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;slice::align_to&lt;/code&gt;&lt;/a&gt; и его мутабельный аналог&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.slice.html#method.chunks_exact&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;slice::chunks_exact&lt;/code&gt;&lt;/a&gt;,
а также его мутабельный и &lt;code class=&quot;highlighter-rouge&quot;&gt;r&lt;/code&gt; аналоги (такие как
&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.slice.html#method.rchunks_mut&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;slice::rchunks_exact_mut&lt;/code&gt;&lt;/a&gt;) во всех комбинациях&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1310-2018-12-06&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;uluchshieniia-v-cargo&quot;&gt;Улучшения в Cargo&lt;/h3&gt;

&lt;p&gt;Cargo теперь будет загружать пакеты параллельно, используя HTTP/2.&lt;/p&gt;

&lt;p&gt;Кроме того, так как &lt;code class=&quot;highlighter-rouge&quot;&gt;extern crate&lt;/code&gt; указывать теперь не обязательно, было
бы неприятно писать &lt;code class=&quot;highlighter-rouge&quot;&gt;extern crate foo as bar;&lt;/code&gt; для переименования зависимости.
Поэтому вы можете делать это в &lt;code class=&quot;highlighter-rouge&quot;&gt;Cargo.toml&lt;/code&gt; таким образом:&lt;/p&gt;

&lt;div class=&quot;language-toml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nn&quot;&gt;[dependencies]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;baz&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;0.1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;foo&quot;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;или, что эквивалентно:&lt;/p&gt;

&lt;div class=&quot;language-toml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nn&quot;&gt;[dependencies.baz]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;0.1&quot;&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;foo&quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Теперь пакет &lt;code class=&quot;highlighter-rouge&quot;&gt;foo&lt;/code&gt; доступен как &lt;code class=&quot;highlighter-rouge&quot;&gt;baz&lt;/code&gt; для использования в вашем коде.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1310-2018-12-06&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;razrabotchiki-1310&quot;&gt;Разработчики 1.31.0&lt;/h2&gt;

&lt;p&gt;Обычно в конце обзора мы благодарим &lt;a href=&quot;https://thanks.rust-lang.org/rust/1.31.0&quot;&gt;людей, которые внесли свой вклад в
подготовку выпуска&lt;/a&gt;. Но в этот раз,
в отличии от прошлых, этот список не полностью охватывает всех тех людей, которые
помогали, и все то количество работы, которая была проделана. Каждый обычный
выпуск - это результат шестинедельной работы, но данный выпуск - это кульминация
трех лет усилий, отраженных в несметном числе репозиториев, сделанных огромным
количеством людей. Нам было приятно со всеми вами работать, и мы с нетерпением 
ожидаем продолжения развития Rust в течении следующих трех лет.&lt;/p&gt;
</description>
        <pubDate>Thu, 06 Dec 2018 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/12/06/rust-1.31.0.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/12/06/rust-1.31.0.html</guid>
        
        
        <category>новости</category>
        
      </item>
    
      <item>
        <title>Конференция RustRush 15-16 декабря в Москве</title>
        <description>&lt;p&gt;Всем привет!&lt;/p&gt;

&lt;p&gt;15-16 декабря в Москве пройдёт первая международная конференция по Rust в России,
RustRush 2018!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2018-10-09-rustrush-2018/750x278-dcf172ecf14b90012738a29244a768f11ee07476e9ef7d1db06023b6c42c10a6.jpg&quot; alt=&quot;анонс&quot; width=&quot;750&quot; height=&quot;278&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Это двухдневная конференция с докладами и воркшопами.&lt;/p&gt;

&lt;p&gt;До 19 ноября открыт приём докладов. &lt;a href=&quot;https://www.papercall.io/rustrush&quot;&gt;Подать доклад&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Билеты уже в продаже. Для участников сообщества доступен промо-код &lt;code class=&quot;highlighter-rouge&quot;&gt;RUSTYCRATE&lt;/code&gt;
со скидкой 20% на обычные билеты. &lt;a href=&quot;https://rustrush.ru/buy&quot;&gt;Купить билет&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Участникам конференции доступен блок номер в отеле конференции — 
&lt;a href=&quot;https://rustrush.ru/place&quot;&gt;Novotel Moscow City&lt;/a&gt;. Как забронировать —
читайте дальше.&lt;/p&gt;

&lt;p&gt;Если вашей компании интересно мероприятие, свяжитесь с нами по почте 
&lt;a href=&quot;mailto:sponsor@rustrush.ru&quot;&gt;sponsor@rustrush.ru&lt;/a&gt;. Мы предлагаем групповые 
билеты, помощь в продвижении ваших продуктов, помощь в поиске разработчиков на 
Rust.&lt;/p&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;h1 id=&quot;dokladchiki&quot;&gt;Докладчики&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://rustrush.ru/speakers&quot; target=&quot;blank&quot;&gt;
&lt;img src=&quot;/assets/2018-10-09-rustrush-2018/speakers-dbc48bd63cebbec4b3863a218661f87a746701f372655c085a805a2dc743c704.png&quot; alt=&quot;докладчики&quot; width=&quot;75%&quot; height=&quot;958&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;К нам приедут 4 докладчика из Rust Project: Стив Клабник, Эшли Уильямс, Паскаль 
Хертлиф, Катарина Фей. &lt;a href=&quot;https://rustrush.ru/speakers&quot;&gt;Все докладчики&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;doklady&quot;&gt;Доклады&lt;/h1&gt;

&lt;p&gt;На данный момент анонсировано 2 доклада. 
&lt;a href=&quot;https://rustrush.ru/program&quot;&gt;Полная программа&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;podkhod-rust-kak-dielat-vieshchi-pravilno-paskal-khiertlif&quot;&gt;Подход Rust: как делать вещи правильно. Паскаль Хертлиф&lt;/h2&gt;

&lt;p&gt;Паскаль - ведущий рабочей группы CLI в проекте Rust. Он - автор и участник 
многих крейтов. Также Паскаль - соорганизатор митапа Rust Кёльн.&lt;/p&gt;

&lt;p&gt;Этот доклад - про то, как Rust не изобретает ничего нового. Сам Rust - думаете, 
это какое-то изобретение? Нет. Он позаимствовал (игра слов) многое из таких 
языков, как Cyclone и ATS, и это задало тон для всего сообщества. Не 
руководствуйтесь правилом “Not Invented Here”. Лучше возьмите что-то из другой 
экосистемы, что-то академическое, какую-то хорошую, но неудобную библиотеку, 
доработайте их для массового применения всеми - и вы в шоколаде!&lt;/p&gt;

&lt;h2 id=&quot;istoriia-async-i-iegho-budushchieie-katarina-fiei&quot;&gt;История async и его будущее. Катарина Фей&lt;/h2&gt;

&lt;p&gt;Катарина активно пишет на Rust с 2017 и является автором многих крейтов. Она - 
участник рабочей группы CLI, а её основная область ответственности - 
эргономика разработчиков.&lt;/p&gt;

&lt;p&gt;Асинхронное сетевое программирование вызывает большой интерес. И сообщество 
Rust - не исключение. Хорошая поддержка асинхронности важна, особенно учитывая 
растущую популярность языка в разработке сетевых приложений и распределённых 
систем. Это было целью рабочей группы Networking для Rust 2018. И хотя не все 
цели для выпуска в конце года были достигнуты, были сделаны существенные 
изменения и в основе синтаксиса, и в экосистеме. В этом докладе мы рассмотрим и 
уже сделанные вещи, и то, что ещё только запланировано.&lt;/p&gt;

&lt;h1 id=&quot;blok-nomierov-dlia-uchastnikov&quot;&gt;Блок номеров для участников&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://rustrush.ru/place&quot; target=&quot;blank&quot;&gt;
&lt;img src=&quot;/assets/2018-10-09-rustrush-2018/room-11332eaa3acf415f590070738b17df8abf292231de24f87791a4705ac5c5ffed.jpg&quot; alt=&quot;номер&quot; width=&quot;75%&quot; height=&quot;683&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Доступны Улучшенные номера
с одной кроватью или двумя отдельными кроватями. Забронировать можно по почте
&lt;a href=&quot;mailto:H7149-RE@ACCOR.COM?subject=Booking%20for%20RustRush&amp;amp;body=Hello%2C%0AI'd%20like%20to%20book%20a%20room.%0AMy%20information%3A%0ABooking%20Dates%0AFull%20Name%0APhone%20Number%0AEmail%0A%0APromo%20Code%3A%20RUSTYCRATE&quot;&gt;H7149-RE@ACCOR.COM&lt;/a&gt;, сообщив следующие данные:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Даты бронирования&lt;/li&gt;
  &lt;li&gt;ФИО&lt;/li&gt;
  &lt;li&gt;Номер телефона&lt;/li&gt;
  &lt;li&gt;Email&lt;/li&gt;
  &lt;li&gt;Промокод: RUSTYCRATE&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;zakliuchieniie&quot;&gt;Заключение&lt;/h1&gt;

&lt;p&gt;Билеты уже в продаже. Для участников сообщества доступен промо-код &lt;code class=&quot;highlighter-rouge&quot;&gt;RUSTYCRATE&lt;/code&gt;
со скидкой 20% на обычные билеты. &lt;a href=&quot;https://rustrush.ru/buy&quot;&gt;Купить билет&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Если вашей компании интересно мероприятие, свяжитесь с нами по почте 
&lt;a href=&quot;mailto:sponsor@rustrush.ru&quot;&gt;sponsor@rustrush.ru&lt;/a&gt;. Мы предлагаем групповые 
билеты, помощь в продвижении ваших продуктов, помощь в поиске разработчиков на 
Rust.&lt;/p&gt;

&lt;p&gt;Подпишитесь на нас в социальных сетях или по email:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.facebook.com/app_scoped_user_id/YXNpZADpBWEd5dlRKZAkFnbFNkeDg4OWpoQWN0bmdIbHJqMkRDU1dkMGZAXNWhuQXpxY1diN2NUM2V4Ui1lbVBLYzJJSnUyblAweUxfZAlFfdXlzNk45c1pOY0VSVmg2eDZAFVVJ0SEc1dzZALWmpaZAwZDZD/&quot;&gt;Facebook&lt;/a&gt;, 
&lt;a href=&quot;https://www.twitter.com/rustrush1/&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;https://vk.com/rustrush1&quot;&gt;VK&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Begin Mailchimp Signup Form --&gt;
&lt;link href=&quot;//cdn-images.mailchimp.com/embedcode/horizontal-slim-10_7.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;

&lt;style type=&quot;text/css&quot;&gt;
	#mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; width:100%;}
	/* Add your own Mailchimp form style overrides in your site stylesheet or in this style block.
	   We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */
&lt;/style&gt;

&lt;div id=&quot;mc_embed_signup&quot;&gt;
&lt;form action=&quot;https://rustrush.us18.list-manage.com/subscribe/post?u=e387a2b04fa24176bdc45cd14&amp;amp;id=4c18970b6a&quot; method=&quot;post&quot; id=&quot;mc-embedded-subscribe-form&quot; name=&quot;mc-embedded-subscribe-form&quot; class=&quot;validate&quot; target=&quot;_blank&quot; novalidate=&quot;&quot;&gt;
    &lt;div id=&quot;mc_embed_signup_scroll&quot;&gt;
	&lt;label for=&quot;mce-EMAIL&quot;&gt;Subscribe to our mailing list&lt;/label&gt;
	&lt;input type=&quot;email&quot; value=&quot;&quot; name=&quot;EMAIL&quot; class=&quot;email&quot; id=&quot;mce-EMAIL&quot; placeholder=&quot;email address&quot; required=&quot;&quot; /&gt;
    &lt;!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups--&gt;
    &lt;div style=&quot;position: absolute; left: -5000px;&quot; aria-hidden=&quot;true&quot;&gt;&lt;input type=&quot;text&quot; name=&quot;b_e387a2b04fa24176bdc45cd14_4c18970b6a&quot; tabindex=&quot;-1&quot; value=&quot;&quot; /&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;input type=&quot;submit&quot; value=&quot;Subscribe&quot; name=&quot;subscribe&quot; id=&quot;mc-embedded-subscribe&quot; class=&quot;button&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/form&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://rustrush.ru/buy&quot; target=&quot;blank&quot;&gt;
&lt;img src=&quot;/assets/2018-10-09-rustrush-2018/button_kupit-bilet-6d014bda3b9e71d31363176052e45e3060d272b0b1b8e158573097be99f1fd1a.png&quot; alt=&quot;купить билет&quot; width=&quot;177&quot; height=&quot;40&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;!--End mc_embed_signup--&gt;
</description>
        <pubDate>Fri, 09 Nov 2018 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/11/09/rustrush-2018.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/11/09/rustrush-2018.html</guid>
        
        <category>эксклюзивы</category>
        
        
        <category>новости</category>
        
      </item>
    
      <item>
        <title>Выпуск Rust 1.30</title>
        <description>&lt;p&gt;Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.30.0.
Rust - это системный язык программирования, нацеленный на безопасность, скорость
и параллельное выполнение кода.&lt;/p&gt;

&lt;p&gt;Если у вас установлена предыдущая версия Rust с помощью &lt;code class=&quot;highlighter-rouge&quot;&gt;rustup&lt;/code&gt;, то для обновления
Rust до версии 1.30.0 вам достаточно выполнить:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;rustup update stable
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если у вас еще не установлен &lt;code class=&quot;highlighter-rouge&quot;&gt;rustup&lt;/code&gt;, вы можете &lt;a href=&quot;https://www.rust-lang.org/install.html&quot;&gt;установить его&lt;/a&gt; с соответствующей
страницы нашего веб-сайта. С &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1300-2018-10-25&quot;&gt;подробными примечаниями к выпуску Rust 1.30.0&lt;/a&gt;
можно ознакомиться на GitHub.&lt;/p&gt;

&lt;h2 id=&quot;chto-voshlo-v-stabilnuiu-viersiiu-1300&quot;&gt;Что вошло в стабильную версию 1.30.0&lt;/h2&gt;

&lt;p&gt;Rust 1.30 - выдающийся выпуск с рядом важных нововведений. Но уже в понедельник
в официальном блоге будет опубликована просьба проверить бета-версию Rust 1.31,
которая станет первым релизом “Rust 2018”. Дополнительную информацию об этом
вы найдете в нашей предыдущей публикации &lt;a href=&quot;https://blog.rust-lang.org/2018/07/27/what-is-rust-2018.html&quot;&gt;“What is Rust 2018”&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;protsiedurnyie-makrosy&quot;&gt;Процедурные макросы&lt;/h3&gt;

&lt;p&gt;Еще в &lt;a href=&quot;https://blog.rust-lang.org/2017/02/02/Rust-1.15.html&quot;&gt;Rust 1.15&lt;/a&gt; мы добавили возможность определять “пользовательские derive-макросы”.
Например, с помощью &lt;code class=&quot;highlighter-rouge&quot;&gt;serde_derive&lt;/code&gt;, вы можете объявить:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;derive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Serialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Deserialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Pet&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;И конвертировать &lt;code class=&quot;highlighter-rouge&quot;&gt;Pet&lt;/code&gt; в JSON и обратно в структуру, используя &lt;code class=&quot;highlighter-rouge&quot;&gt;serde_json&lt;/code&gt;. Это возможно
благодаря автоматическому выводу типажей &lt;code class=&quot;highlighter-rouge&quot;&gt;Serialize&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;Deserialize&lt;/code&gt; с помощью процедурных
макросов в &lt;code class=&quot;highlighter-rouge&quot;&gt;serde_derive&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Rust 1.30 расширяет функционал процедурных макросов, добавляя возможность определять еще два
других типа макросов: “атрибутные процедурные макросы” и “функциональные процедурные макросы”.&lt;/p&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;p&gt;Атрибутные макросы подобны derive-макросам для автоматического вывода, но вместо генерации
кода только для атрибута &lt;code class=&quot;highlighter-rouge&quot;&gt;#[derive]&lt;/code&gt;, они позволяют пользователям создавать собственные новые
атрибуты. Это делает их более гибкими: derive-макросы работают только для структур и
перечислений, но атрибуты могут применяться и к другим объектам, таким как функции. Например,
атрибутные макросы позволят вам при использовании веб-фреймворка делать следующее:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;#[route(GET, &quot;/&quot;)]
fn index() {
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Этот атрибут &lt;code class=&quot;highlighter-rouge&quot;&gt;#[route]&lt;/code&gt; будет определен в самом фреймворке как процедурный макрос. Его
сигнатура будет выглядеть так:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;#[proc_macro_attribute]
pub fn route(attr: TokenStream, item: TokenStream) -&amp;gt; TokenStream {
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Здесь у нас имеется два входных параметра типа &lt;code class=&quot;highlighter-rouge&quot;&gt;TokenStream&lt;/code&gt;: первый - для содержимого
самого атрибута, то есть это параметры &lt;code class=&quot;highlighter-rouge&quot;&gt;GET, &quot;/&quot;&lt;/code&gt;. Второй - это тело того объекта, к
которому применен атрибут. В нашем случае - это &lt;code class=&quot;highlighter-rouge&quot;&gt;fn index() {}&lt;/code&gt; и остальная часть
тела функции.&lt;/p&gt;

&lt;p&gt;Функциональные макросы определяют такие макросы, использование которых выглядит как
вызов функции. Например, макрос &lt;code class=&quot;highlighter-rouge&quot;&gt;sql!&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sql&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;sql!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;posts&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Этот макрос внутри себя будет разбирать SQL-выражения и проверять их на
синтаксическую корректность. Подобный макрос должен быть объявлен следующим
образом:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;#[proc_macro]
pub fn sql(input: TokenStream) -&amp;gt; TokenStream {
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Это похоже на сигнатуру derive-макроса: мы получаем токены, которые находятся
внутри скобок, и возвращаем сгенерированный по ним код.&lt;/p&gt;

&lt;h3 id=&quot;makrosy-i-use&quot;&gt;Макросы и &lt;code class=&quot;highlighter-rouge&quot;&gt;use&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Теперь можно &lt;a href=&quot;https://github.com/rust-lang/rust/pull/50911/&quot;&gt;импортировать макросы в область видимости с помощью ключевого слова &lt;code class=&quot;highlighter-rouge&quot;&gt;use&lt;/code&gt;&lt;/a&gt;.
Например, для использования макроса &lt;code class=&quot;highlighter-rouge&quot;&gt;json&lt;/code&gt; из пакета &lt;code class=&quot;highlighter-rouge&quot;&gt;serde-json&lt;/code&gt;, раньше использовалась запись:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;macro_use&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;serde_json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;john&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;json!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;phones&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;+44 1234567&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;+44 2345678&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;А теперь вы должны будете написать:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;crate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;serde_json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;serde_json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;john&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;json!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;phones&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;+44 1234567&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;+44 2345678&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Здесь макрос импортируется также, как и другие элементы, так что нет
необходимости в использовании аннотации &lt;code class=&quot;highlighter-rouge&quot;&gt;macro_use&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Наконец, стабилизирован &lt;a href=&quot;https://doc.rust-lang.org/stable/proc_macro/&quot;&gt;пакет &lt;code class=&quot;highlighter-rouge&quot;&gt;proc_macro&lt;/code&gt;&lt;/a&gt;,
который дает API, необходимый для написания процедурных макросов. В нем также значительно
улучшили API для обработки ошибок, и такие пакеты, как &lt;code class=&quot;highlighter-rouge&quot;&gt;syn&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;quote&lt;/code&gt; уже используют его.
Например, раньше:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-rust,ignore&quot;&gt;#[derive(Serialize)]
struct Demo {
    ok: String,
    bad: std::thread::Thread,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;приводило к такой ошибке:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;error[E0277]: the trait bound `std::thread::Thread: _IMPL_SERIALIZE_FOR_Demo::_serde::Serialize` is not satisfied
 --&amp;gt; src/main.rs:3:10
  |
3 | #[derive(Serialize)]
  |          ^^^^^^^^^ the trait `_IMPL_SERIALIZE_FOR_Demo::_serde::Serialize` is not implemented for `std::thread::Thread`
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Теперь же будет выдано:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;error[E0277]: the trait bound `std::thread::Thread: serde::Serialize` is not satisfied
 --&amp;gt; src/main.rs:7:5
  |
7 |     bad: std::thread::Thread,
  |     ^^^ the trait `serde::Serialize` is not implemented for `std::thread::Thread`
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&quot;uluchshieniie-sistiemy-moduliei&quot;&gt;Улучшение системы модулей&lt;/h2&gt;

&lt;p&gt;Система модулей долгое время становилась больным местом для новичков в Rust’е; некоторые
из ее правил оказывались неудобными на практике. Настоящие изменения являются первым
шагом, который мы предпринимаем на пути упрощения системы модулей.&lt;/p&gt;

&lt;p&gt;В дополнении к вышеупомянутому изменению для макросов, есть два новых улучшения
в использовании &lt;code class=&quot;highlighter-rouge&quot;&gt;use&lt;/code&gt;. Во-первых, &lt;a href=&quot;https://github.com/rust-lang/rust/pull/54404/&quot;&gt;внешние пакеты теперь добавляются в prelude&lt;/a&gt;,
то есть:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// было&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;serde_json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;from_str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// стало&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;serde_json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;from_str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Подвох в том, что старый стиль не всегда был нужен из-за особенностей работы
системы модулей Rust:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-rust,ignore&quot;&gt;extern crate serde_json;

fn main() {
    // это прекрасно работает; мы находимся в корне пакета, поэтому `serde_json`
    // здесь в области видимости
    let json = serde_json::from_str(&quot;...&quot;);
}

mod foo {
    fn bar() {
        // это не работает; мы внутри пространства имен `foo`, и `serde_json`
        // здесь не объявлен
        let json = serde_json::from_str(&quot;...&quot;);

    }

    // одно решение - это импортировать его внутрь модуля с помощью `use`
    use serde_json;

    fn baz() {
        // другое решение - это использовать `::serde_json`, когда указывается
        // абсолютный путь, вместо относительного
        let json = ::serde_json::from_str(&quot;...&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Было неприятно получать сломанный код, просто перемещая функцию в подмодуль.
Теперь же будет проверяться первая часть пути, и если она соответствует некоторому
&lt;code class=&quot;highlighter-rouge&quot;&gt;extern crate&lt;/code&gt;, то он будет использоваться независимо от положения вызова в иерархии
модулей.&lt;/p&gt;

&lt;p&gt;Наконец, &lt;a href=&quot;https://github.com/rust-lang/rust/pull/54404/&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;use&lt;/code&gt; стал поддерживать импорт элементов в текущую область видимости с путями,
которые начинаются на &lt;code class=&quot;highlighter-rouge&quot;&gt;crate&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;mod&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// было&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// или&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// стало&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;crate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Ключевое слово &lt;code class=&quot;highlighter-rouge&quot;&gt;crate&lt;/code&gt; в начале пути указывает, что путь будет начинаться от корня пакета.
Раньше пути, указанные в строке импорта &lt;code class=&quot;highlighter-rouge&quot;&gt;use&lt;/code&gt;, всегда указывались относительно корня
пакета, но пути в остальном коде, напрямую ссылающиеся на элементы, указывались относительно
текущего модуля, что приводило к противоречивому поведению путей:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;mod&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;mod&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;baz&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;qux&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;// было&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;// не работает, в отличии от `use`:&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;// foo::bar();&lt;/span&gt;

        &lt;span class=&quot;c&quot;&gt;// стало&lt;/span&gt;
        &lt;span class=&quot;nn&quot;&gt;crate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Как только новый стиль станет широко использоваться, то он, мы надеемся, сделает абсолютные
пути более ясными, без необходимости использовать уродливый префикс &lt;code class=&quot;highlighter-rouge&quot;&gt;::&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Все эти изменения в совокупности упрощают понимание того, как разрешаются пути. В любом
месте, где вы видите путь &lt;code class=&quot;highlighter-rouge&quot;&gt;a::b::c&lt;/code&gt;, кроме оператора &lt;code class=&quot;highlighter-rouge&quot;&gt;use&lt;/code&gt;, вы можете спросить:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Является ли &lt;code class=&quot;highlighter-rouge&quot;&gt;a&lt;/code&gt; именем пакета? Тогда нужно искать &lt;code class=&quot;highlighter-rouge&quot;&gt;b::c&lt;/code&gt; внутри него.&lt;/li&gt;
  &lt;li&gt;Является ли &lt;code class=&quot;highlighter-rouge&quot;&gt;a&lt;/code&gt; ключевым словом &lt;code class=&quot;highlighter-rouge&quot;&gt;crate&lt;/code&gt;? Тогда нужно искать &lt;code class=&quot;highlighter-rouge&quot;&gt;b::c&lt;/code&gt; от корня текущего пакета.&lt;/li&gt;
  &lt;li&gt;В противном случае, нужно искать &lt;code class=&quot;highlighter-rouge&quot;&gt;a::b::c&lt;/code&gt; от текущего положения в иерархии модулей.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Старое поведение путей в &lt;code class=&quot;highlighter-rouge&quot;&gt;use&lt;/code&gt;, всегда начинающихся от корня пакета, по-прежнему применимо.
Но при единовременном переходе на новый стиль, данные правила будут применяться к путям повсюду
единообразно, и вам придется гораздо меньше заботиться об импортах при перемещении кода.&lt;/p&gt;

&lt;h2 id=&quot;syryie-idientifikatory&quot;&gt;Сырые идентификаторы&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/rust-lang/rust/pull/53236/&quot;&gt;Вы можете теперь использовать ключевые слова как идентификаторы&lt;/a&gt;, используя
следующий новый синтаксис:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// определение локальной переменной с именем `for`&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// определение функции с именем `for`&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// вызов той функции &lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Пока не так много случаев, когда вам это пригодится. Но однажды вы попытаетесь использовать
пакет для Rust 2015 в проекте для Rust 2018 или наоборот, тогда набор ключевых слов у них
будет разным. Мы расскажем об этом подробнее в предстоящем анонсе Rust 2018.&lt;/p&gt;

&lt;h2 id=&quot;prilozhieniia-biez-standartnoi-bibliotieki&quot;&gt;Приложения без стандартной библиотеки&lt;/h2&gt;

&lt;p&gt;Еще в Rust 1.6 мы объявили о &lt;a href=&quot;https://blog.rust-lang.org/2016/01/21/Rust-1.6.html&quot;&gt;стабилизации &lt;code class=&quot;highlighter-rouge&quot;&gt;no_std&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;libcore&lt;/code&gt;&lt;/a&gt;
для создания проектов без стандартной библиотеки. Однако, с одним уточнением:
можно было создавать только библиотеки, но не приложения.&lt;/p&gt;

&lt;p&gt;В Rust 1.30 можно использовать атрибут &lt;a href=&quot;https://github.com/rust-lang/rust/pull/51366/&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;#[panic_handler]&lt;/code&gt;&lt;/a&gt;
для самостоятельной реализации паники. Это означает, что теперь можно создавать
приложения, а не только библиотеки, которые не используют стандартную библиотеку.&lt;/p&gt;

&lt;h2 id=&quot;drughoie&quot;&gt;Другое&lt;/h2&gt;

&lt;p&gt;И последнее: в макросах теперь можно
&lt;a href=&quot;https://github.com/rust-lang/rust/pull/53370/&quot;&gt;сопоставлять модификаторы области видимости, такие как &lt;code class=&quot;highlighter-rouge&quot;&gt;pub&lt;/code&gt;&lt;/a&gt;,
с помощью спецификатора &lt;code class=&quot;highlighter-rouge&quot;&gt;vis&lt;/code&gt;. Дополнительно, “инструментальные
атрибуты”, такие как &lt;code class=&quot;highlighter-rouge&quot;&gt;#[rustfmt::skip]&lt;/code&gt;, &lt;a href=&quot;https://github.com/rust-lang/rust/pull/53459/&quot;&gt;теперь стабилизированы&lt;/a&gt;.
Правда для использования с инструментами &lt;em&gt;статического анализа&lt;/em&gt;, наподобие
&lt;code class=&quot;highlighter-rouge&quot;&gt;#[allow(clippy::something)]&lt;/code&gt;, они еще не стабильны.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1300-2018-10-25&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;stabilizatsiia-standartnoi-bibliotieki&quot;&gt;Стабилизация стандартной библиотеки&lt;/h3&gt;

&lt;p&gt;В этом выпуске были &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#stabilized-apis&quot;&gt;стабилизированы следующие API&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Ipv4Addr::{BROADCAST, LOCALHOST, UNSPECIFIED}&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Ipv6Addr::{BROADCAST, LOCALHOST, UNSPECIFIED}&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Iterator::find_map&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Кроме того, стандартная библиотека уже давно имеет функции для удаления пробелов с
одной стороны некоторого текста, такие как &lt;code class=&quot;highlighter-rouge&quot;&gt;trim_left&lt;/code&gt;. Однако, для RTL-языков значение
“справа” и “слева” тут приводят к путанице. Поэтому мы вводим новые имена для этих функций:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;trim_left&lt;/code&gt; -&amp;gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;trim_start&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;trim_right&lt;/code&gt; -&amp;gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;trim_end&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;trim_left_matches&lt;/code&gt; -&amp;gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;trim_start_matches&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;trim_right_matches&lt;/code&gt; -&amp;gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;trim_end_matches&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Мы планируем объявить устаревшими старые имена (но не удалить, конечно) в Rust 1.33.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1300-2018-10-25&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;uluchshieniia-v-cargo&quot;&gt;Улучшения в Cargo&lt;/h3&gt;

&lt;p&gt;Самое большое улучшение Cargo в этом выпуске заключается в том, что теперь
&lt;a href=&quot;https://github.com/rust-lang/cargo/pull/5995/&quot;&gt;у нас есть индикатор выполнения!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blog.rust-lang.org/images/2018-10-25-Rust-1.30/demo.gif&quot; alt=&quot;demo gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1300-2018-10-25&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;razrabotchiki-1300&quot;&gt;Разработчики 1.30.0&lt;/h2&gt;

&lt;p&gt;Множество людей совместно создавало Rust 1.30. Мы не смогли бы
завершить работу без участия каждого из вас. &lt;a href=&quot;https://thanks.rust-lang.org/rust/1.30.0&quot;&gt;Спасибо!&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 25 Oct 2018 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/10/25/rust-1.30.0.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/10/25/rust-1.30.0.html</guid>
        
        
        <category>новости</category>
        
      </item>
    
      <item>
        <title>Выпуск Rust 1.29</title>
        <description>&lt;p&gt;Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.29.0.
Rust - это системный язык программирования, нацеленный на безопасность,
скорость и параллельное выполнение кода.&lt;/p&gt;

&lt;p&gt;Если у вас установлена предыдущая версия Rust с помощью Rustup,
то для обновления Rust до версии 1.29.0 вам достаточно выполнить:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;rustup update stable
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если у вас еще не установлен Rustup, вы можете &lt;a href=&quot;https://www.rust-lang.org/install.html&quot;&gt;установить его&lt;/a&gt;
с соответствующей страницы нашего веб-сайта.
С &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1290-2018-09-13&quot;&gt;подробными примечаниями к выпуску Rust 1.29.0&lt;/a&gt; можно ознакомиться
на GitHub.&lt;/p&gt;

&lt;h2 id=&quot;chto-voshlo-v-stabilnuiu-viersiiu-1290&quot;&gt;Что вошло в стабильную версию 1.29.0&lt;/h2&gt;

&lt;p&gt;1.29 привносит не очень много изменений.
Ожидается что Rust 1.30 и 1.31 будут очень значительными,
так что большая часть 1.29 итерации ушла на подготовку к будущим изменениям.
Два самых заметных нововведения этого выпуска даже не касаются самого языка:
это две новые возможности Cargo и обе они связаны с предупреждениями.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fix&lt;/code&gt; автоматически исправляет предупреждения в коде&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;cargo clippy&lt;/code&gt; - статический анализатор Rust кода,
  помогающий поймать распространенные ошибки и просто улучшить код&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cargo-fix&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fix&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;С выпуском Rust 1.29 у Cargo появляется новая подкоманда: &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fix&lt;/code&gt;.
Если вы когда-либо писали на Rust, то скорее всего уже сталкивались с
предупреждениями компилятора. Например, рассмотрим такой код:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;do_something&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;do_something&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;p&gt;В нем мы вызываем &lt;code class=&quot;highlighter-rouge&quot;&gt;do_something&lt;/code&gt; сто раз, но никогда не используем
переменную &lt;code class=&quot;highlighter-rouge&quot;&gt;i&lt;/code&gt;. Rust предупреждает нас об этом:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt; cargo build
   Compiling myprogram v0.1.0 (file:///path/to/myprogram)
warning: unused variable: `i`
 --&amp;gt; src\main.rs:4:9
  |
4 |     for i in 1..100 {
  |         ^ help: consider using `_i` instead
  |
  = note: #[warn(unused_variables)] on by default

    Finished dev [unoptimized + debuginfo] target(s) in 0.50s
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Видите подсказку о переименовании в &lt;code class=&quot;highlighter-rouge&quot;&gt;_i&lt;/code&gt;?
Мы можем автоматически применить ее при помощи &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fix&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt; cargo fix
    Checking myprogram v0.1.0 (file:///C:/Users/steve/tmp/fix)
      Fixing src\main.rs (1 fix)
    Finished dev [unoptimized + debuginfo] target(s) in 0.59s
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если теперь мы откроем &lt;code class=&quot;highlighter-rouge&quot;&gt;src\main.rs&lt;/code&gt;, то увидим исправленный код:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;do_something&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;do_something&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Теперь в коде используется &lt;code class=&quot;highlighter-rouge&quot;&gt;_i&lt;/code&gt;, и предупреждение больше не выдается.&lt;/p&gt;

&lt;p&gt;Первая версия &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fix&lt;/code&gt; исправляет далеко не все предупреждения.
Для своей работы &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo fix&lt;/code&gt; использует специальный API компилятора,
который предлагает исправлять только те предупреждения,
в которых мы абсолютно уверены.
Со временем их список будет расширяться.&lt;/p&gt;

&lt;h3 id=&quot;cargo-clippy&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;cargo clippy&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Еще о предупреждениях: теперь вы можете попробовать &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo-clippy&lt;/code&gt; через Rustup.
Clippy это статический анализатор,
который выполняет много дополнительных проверок вашего кода.&lt;/p&gt;

&lt;p&gt;Например:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lock_guard&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mutex&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;nn&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;mem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;drop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lock_guard&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;operation_that_requires_mutex_to_be_unlocked&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Синтаксически это правильный код, но мы можем получить дедлок,
потому что вызвали &lt;code class=&quot;highlighter-rouge&quot;&gt;drop&lt;/code&gt; для &lt;em&gt;ссылки на &lt;code class=&quot;highlighter-rouge&quot;&gt;lock_guard&lt;/code&gt;&lt;/em&gt;, а не для самого &lt;code class=&quot;highlighter-rouge&quot;&gt;lock_guard&lt;/code&gt;.
Вызов &lt;code class=&quot;highlighter-rouge&quot;&gt;drop&lt;/code&gt; для ссылки имеет мало смысла и почти наверняка является ошибкой.&lt;/p&gt;

&lt;p&gt;Установим предварительную версию Clippy через Rustup:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;$ rustup component add clippy-preview
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;и запустим ее:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;$ cargo clippy
error: calls to `std::mem::drop` with a reference instead of an owned value. Dropping a reference does nothing.
 --&amp;gt; src\main.rs:5:5
  |
5 |     std::mem::drop(&amp;amp;lock_guard);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[deny(drop_ref)] on by default
note: argument has type &amp;amp;std::result::Result&amp;lt;std::sync::MutexGuard&amp;lt;'_, i32&amp;gt;, std::sync::PoisonError&amp;lt;std::sync::MutexGuard&amp;lt;'_, i32&amp;gt;&amp;gt;&amp;gt;
 --&amp;gt; src\main.rs:5:20
  |
5 |     std::mem::drop(&amp;amp;lock_guard);
  |                    ^^^^^^^^^^^
  = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.212/index.html#drop_ref
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Как видно из примечания к сообщению, вы можете получить полный список
всех возможных предупреждений по ссылке.&lt;/p&gt;

&lt;p&gt;Обратите внимание, что это только ознакомительная версия;
Clippy еще не достиг 1.0, поэтому набор и поведение проверок еще могут меняться.
Мы выпустим компонент &lt;code class=&quot;highlighter-rouge&quot;&gt;clippy&lt;/code&gt;, как только он будет стабилизирован,
а пока просим вас посмотреть на деле предварительную версию
и рассказать нам о своем опыте.&lt;/p&gt;

&lt;p&gt;Да, есть еще нюанс:
к сожалению, пока что нельзя использовать clippy вместе с &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo-fix&lt;/code&gt;.
Работа над этим ведется.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1290-2018-09-13&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;stabilizatsiia-standartnoi-bibliotieki&quot;&gt;Стабилизация стандартной библиотеки&lt;/h3&gt;

&lt;p&gt;В этом выпуске были стабилизированы следующие API:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/sync/struct.Arc.html#method.downcast&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Arc&amp;lt;T&amp;gt;::downcast&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/rc/struct.Rc.html#method.downcast&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Rc&amp;lt;T&amp;gt;::downcast&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flatten&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Iterator::flatten&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Также теперь вы можете &lt;a href=&quot;https://github.com/rust-lang/rust/pull/51178/&quot;&gt;сравнивать &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;amp;str&lt;/code&gt; и
&lt;code class=&quot;highlighter-rouge&quot;&gt;OsString&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1290-2018-09-13&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;uluchshieniia-v-cargo&quot;&gt;Улучшения в Cargo&lt;/h3&gt;

&lt;p&gt;Выше мы уже описали две новые подкоманды Cargo.
Также &lt;a href=&quot;https://github.com/rust-lang/cargo/pull/5831/&quot;&gt;Cargo теперь будет автоматически пытаться починить Cargo.lock файлы,
испорченные &lt;code class=&quot;highlighter-rouge&quot;&gt;git merge&lt;/code&gt;ом&lt;/a&gt;.
Это поведение можно отключить флагом &lt;code class=&quot;highlighter-rouge&quot;&gt;--locked&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;cargo doc&lt;/code&gt; обзавелся новым флагом:
&lt;a href=&quot;https://github.com/rust-lang/cargo/pull/5543&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;--document-private-items&lt;/code&gt;&lt;/a&gt;.
По умолчанию, &lt;code class=&quot;highlighter-rouge&quot;&gt;cargo doc&lt;/code&gt; документирует только публичные части API,
потому что предназначен для генерации пользовательской документации.
Но если вы работаете над своим пакетом и в нем есть внутренняя документация,
то &lt;code class=&quot;highlighter-rouge&quot;&gt;--document-private-items&lt;/code&gt; включит генерацию документации вообще для всего.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1290-2018-09-13&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;razrabotchiki-1290&quot;&gt;Разработчики 1.29.0&lt;/h2&gt;

&lt;p&gt;Множество людей участвовало в разработке Rust 1.29. Мы не смогли бы
завершить работу без участия каждого из вас.
&lt;a href=&quot;https://thanks.rust-lang.org/rust/1.29.0&quot;&gt;Спасибо!&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 13 Sep 2018 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/09/13/rust-1.29.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/09/13/rust-1.29.html</guid>
        
        
        <category>новости</category>
        
      </item>
    
      <item>
        <title>Выпуск Rust 1.28</title>
        <description>&lt;p&gt;Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.28.0.
Rust - это системный язык программирования, нацеленный на безопасность, скорость
и параллельное выполнение кода.&lt;/p&gt;

&lt;p&gt;Если у вас установлена предыдущая версия Rust с помощью rustup, то для обновления
Rust до версии 1.28.0 вам достаточно выполнить:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;rustup update stable
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если у вас еще не установлен rustup, вы можете &lt;a href=&quot;https://www.rust-lang.org/install.html&quot;&gt;установить его&lt;/a&gt; с соответствующей
страницы нашего веб-сайта. С &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1280-2018-08-02&quot;&gt;подробными примечаниями к выпуску Rust 1.28.0&lt;/a&gt;
можно ознакомиться на GitHub.&lt;/p&gt;

&lt;h2 id=&quot;chto-voshlo-v-stabilnuiu-viersiiu-1280&quot;&gt;Что вошло в стабильную версию 1.28.0&lt;/h2&gt;

&lt;h3 id=&quot;globalnyie-allokatory&quot;&gt;Глобальные аллокаторы&lt;/h3&gt;

&lt;p&gt;С помощью аллокаторов программы на Rust получают память во время выполнения.
Раньше Rust не позволял изменять способ распределения памяти, что ограничивало
его использование в некоторых случаях. На одних платформах использовался
jemalloc, на других - системный аллокатор, но пользователи не могли это
контролировать. В выпуске 1.28.0 стабилизирован атрибут &lt;code class=&quot;highlighter-rouge&quot;&gt;#[global_allocator]&lt;/code&gt;,
который позволяет программам на Rust выбирать системный аллокатор, а также
определять новые аллокаторы, реализуя типаж &lt;a href=&quot;https://doc.rust-lang.org/stable/std/alloc/trait.GlobalAlloc.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;GlobalAlloc&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Аллокатор по умолчанию для Rust-программ на некоторых платформах - это jemalloc.
Стандартная библиотека теперь предоставляет дескриптор системного аллокатора,
который можно использовать для переключения на использование системного аллокатора,
когда это необходимо, путем статического объявления с атрибутом &lt;code class=&quot;highlighter-rouge&quot;&gt;#[global_allocator]&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;alloc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#[global_allocator]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GLOBAL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;System&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Память будет выделяться системным аллокатором.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.push&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;p&gt;Однако, иногда вам требуется определить собственный аллокатор для специфической
функциональной области вашего приложения. Это тоже относительно легко сделать,
реализовав типаж &lt;code class=&quot;highlighter-rouge&quot;&gt;GlobalAlloc&lt;/code&gt;. Подробнее о том, как это сделать, вы можете
прочитать в &lt;a href=&quot;https://doc.rust-lang.org/stable/std/alloc/trait.GlobalAlloc.html&quot;&gt;документации&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;uluchshieno-soobshchieniie-ob-oshibkie-formatirovaniia&quot;&gt;Улучшено сообщение об ошибке форматирования&lt;/h3&gt;

&lt;p&gt;Работа по улучшению диагностики продолжается, на этот раз с акцентом
на форматирование:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nd&quot;&gt;format!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{_foo}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6u&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Раньше сообщение об ошибке в этом месте было довольно скудным:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;error: invalid format string: expected `'}'`, found `'_'`
  |
2 |     format!(&quot;{_foo}&quot;, _foo = 6usize);
  |             ^^^^^^^^
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Теперь новое диагностическое сообщение указывает конкретную причину, по
которой строка формата недействительна:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;error: invalid format string: invalid argument name `_foo`
  |
2 |     let _ = format!(&quot;{_foo}&quot;, _foo = 6usize);
  |                       ^^^^ invalid argument name in format string
  |
  = note: argument names cannot start with an underscore
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1280-2018-08-02&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;stabilizatsiia-standartnoi-bibliotieki&quot;&gt;Стабилизация стандартной библиотеки&lt;/h3&gt;

&lt;p&gt;Кроме уже упомянутой стабилизации типажа &lt;code class=&quot;highlighter-rouge&quot;&gt;GlobalAlloc&lt;/code&gt;, в этом выпуске
стабилизированы &lt;a href=&quot;https://doc.rust-lang.org/stable/std/num/index.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;NonZero&lt;/code&gt;&lt;/a&gt; числовые типы. Это типы-обертки вокруг
стандартных беззнаковых целочисленных типов: &lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroU8&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroU16&lt;/code&gt;,
&lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroU32&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroU64&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroU128&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroUsize&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Они позволяют оптимизировать размер хранящихся данных. Например, &lt;code class=&quot;highlighter-rouge&quot;&gt;Option&amp;lt;u8&amp;gt;&lt;/code&gt;
занимает два байта, тогда как &lt;code class=&quot;highlighter-rouge&quot;&gt;Option&amp;lt;NonZeroU8&amp;gt;&lt;/code&gt; - один. Обратите внимание,
что эта оптимизация сохраняется даже тогда, когда &lt;code class=&quot;highlighter-rouge&quot;&gt;NonZeroU8&lt;/code&gt; завернут внутрь
другой структуры; в примере ниже показано, что &lt;code class=&quot;highlighter-rouge&quot;&gt;Door&lt;/code&gt; по-прежнему занимает
один байт, даже когда он помещен внутрь &lt;code class=&quot;highlighter-rouge&quot;&gt;Option&lt;/code&gt;. Эта оптимизация применима
также и к перечислениям, определенным пользователем, &lt;code class=&quot;highlighter-rouge&quot;&gt;Option&lt;/code&gt; тут не является
особенным.&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NonZeroU8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NonZeroU8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Door&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;mem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;size_of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Door&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;assert_eq!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;mem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;size_of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Door&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Также было стабилизировано множество других компонентов библиотеки, полный список
которых вы найдете в подробных &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1280-2018-08-02&quot;&gt;примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;uluchshieniia-v-cargo&quot;&gt;Улучшения в Cargo&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/rust-lang/cargo/pull/5584/&quot;&gt;Cargo теперь не позволит вам публиковать пакеты со скриптами сборки, которые
модифицируют каталог &lt;code class=&quot;highlighter-rouge&quot;&gt;src&lt;/code&gt;.&lt;/a&gt; Каталог &lt;code class=&quot;highlighter-rouge&quot;&gt;src&lt;/code&gt; в пакете следует считать
неизменяемым.&lt;/p&gt;

&lt;h2 id=&quot;razrabotchiki-1280&quot;&gt;Разработчики 1.28.0&lt;/h2&gt;

&lt;p&gt;Множество людей участвовало в разработке Rust 1.28. Мы не смогли бы
завершить работу без участия каждого из вас. &lt;a href=&quot;https://thanks.rust-lang.org/rust/1.28.0&quot;&gt;Спасибо!&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 02 Aug 2018 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/08/02/rust-1.28.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/08/02/rust-1.28.html</guid>
        
        
        <category>новости</category>
        
      </item>
    
      <item>
        <title>Выпуск Rust 1.27</title>
        <description>&lt;p&gt;Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.27.0.
Rust - это системный язык программирования, нацеленный на безопасность, скорость
и параллельное выполнение кода.&lt;/p&gt;

&lt;p&gt;Если у вас установлена предыдущая версия Rust с помощью rustup, то для обновления
Rust до версии 1.27.0 вам достаточно выполнить:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;rustup update stable
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если у вас еще не установлен rustup, вы можете &lt;a href=&quot;https://www.rust-lang.org/install.html&quot;&gt;установить его&lt;/a&gt; с соответствующей
страницы нашего веб-сайта. С &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1270-2018-06-21&quot;&gt;подробными примечаниями к выпуску Rust 1.27.0&lt;/a&gt;
можно ознакомиться на GitHub.&lt;/p&gt;

&lt;p&gt;Также мы хотим обратить ваше внимание вот на что: перед выпуском версии 1.27.0
мы обнаружили &lt;a href=&quot;https://github.com/rust-lang/rust/pull/51686&quot;&gt;ошибку&lt;/a&gt; в улучшении
сопоставлений &lt;code class=&quot;highlighter-rouge&quot;&gt;match&lt;/code&gt;, введенном в версии 1.26.0, которая может привести к некорректному
поведению. Поскольку она была обнаружена очень поздно, уже в процессе
выпуска данной версии, хотя присутствует с версии 1.26.0, мы решили не нарушать заведенный
порядок и подготовить исправленную версию 1.27.1, которая выйдет в ближайшее время.
И дополнительно, если потребуется, версию 1.26.3. Подробности вы сможете узнать из соответствующих
примечаний к выпуску.&lt;/p&gt;

&lt;h2 id=&quot;chto-voshlo-v-stabilnuiu-viersiiu-1270&quot;&gt;Что вошло в стабильную версию 1.27.0&lt;/h2&gt;

&lt;p&gt;В этом выпуске выходят два больших и долгожданных улучшения языка. Но сначала небольшой
комментарий относительно документации: во всех книгах в &lt;a href=&quot;https://doc.rust-lang.org/&quot;&gt;библиотечке Rust&lt;/a&gt;
теперь &lt;a href=&quot;https://github.com/rust-lang/rust/pull/49623/&quot;&gt;доступен поиск&lt;/a&gt;! Например, так можно
&lt;a href=&quot;https://doc.rust-lang.org/book/second-edition/?search=borrow&quot;&gt;найти “заимствование” (“borrow”) в книге “Язык программирования Rust”&lt;/a&gt;
Надеемся, это облегчит поиск нужной вам информации. Кроме того, появилась новая
&lt;a href=&quot;https://github.com/rust-lang/rust/pull/49707/&quot;&gt;Книга о &lt;code class=&quot;highlighter-rouge&quot;&gt;rustc&lt;/code&gt;&lt;/a&gt;. В этой книге объясняется, как напрямую использовать
&lt;code class=&quot;highlighter-rouge&quot;&gt;rustc&lt;/code&gt;, а также как получить другую полезную информацию, такую как список всех
статических проверок.&lt;/p&gt;

&lt;h3 id=&quot;simd&quot;&gt;SIMD&lt;/h3&gt;

&lt;p&gt;Итак, теперь о важном: отныне в Rust доступны &lt;a href=&quot;https://github.com/rust-lang/rust/pull/49664/&quot;&gt;базовые возможности использования SIMD&lt;/a&gt;!
SIMD означает “одиночный поток команд, множественный поток данных” (single instruction,
multiple data). Рассмотрим функцию:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;!--cut--&gt;
&lt;div id=&quot;after_cut&quot;&gt;&lt;/div&gt;

&lt;p&gt;Здесь мы берем два целочисленных среза, суммируем их элементы и помещаем
результат в третий срез. Приведенный выше код демонстрирует самый простой
способ сделать это: нужно пройтись по всему набору элементов, сложить их
вместе и сохранить результат. Однако, компиляторы зачастую находят решение
получше. LLVM часто “автоматически векторизует” подобный код, где такая
затейливая формулировка означает просто “использует SIMD”. Представьте,
что срезы &lt;code class=&quot;highlighter-rouge&quot;&gt;a&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;b&lt;/code&gt; имеют длину в 16 элементов оба. Каждый элемент - это
&lt;code class=&quot;highlighter-rouge&quot;&gt;u8&lt;/code&gt;, а значит срезы будут содержать по 128 бит данных каждый. Используя
SIMD, мы можем разместить &lt;em&gt;оба&lt;/em&gt; среза &lt;code class=&quot;highlighter-rouge&quot;&gt;a&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;b&lt;/code&gt; в 128-битных регистрах,
сложить их вместе &lt;em&gt;одной&lt;/em&gt; инструкцией и затем скопировать результирующие 128
бит в &lt;code class=&quot;highlighter-rouge&quot;&gt;c&lt;/code&gt;. Это будет работать намного быстрее!&lt;/p&gt;

&lt;p&gt;Несмотря на то, что стабильная версия Rust всегда была в состоянии
использовать преимущества автоматической векторизации, иногда компилятор
просто недостаточно умен, чтобы понять, что можно ее применить в данном
случае. Кроме того, не все CPU поддерживают такие возможности. Поэтому LLVM
не может использовать их всегда, так как ваша программа может работать на самых
разных аппаратных платформах. Поэтому в Rust 1.27, с добавлением
&lt;a href=&quot;https://doc.rust-lang.org/1.27.0/std/arch/&quot;&gt;модуля &lt;code class=&quot;highlighter-rouge&quot;&gt;std::arch&lt;/code&gt;&lt;/a&gt;, стало возможно использовать
эти виды инструкций &lt;em&gt;напрямую&lt;/em&gt;, то есть теперь мы не обязаны полагаться только 
на интеллектуальную компиляцию. Дополнительно у нас появилась возможность
выбирать конкретную реализацию в зависимости от различных критериев. Например:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cfg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;any&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target_arch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;x86&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_arch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;x86_64&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;target_feature&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;avx2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cp&quot;&gt;#[cfg(target_arch&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;x86&quot;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;arch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;x86&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_mm256_add_epi64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;cp&quot;&gt;#[cfg(target_arch&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;x86_64&quot;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;arch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;x86_64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_mm256_add_epi64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;_mm256_add_epi64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Здесь мы используем флаги &lt;code class=&quot;highlighter-rouge&quot;&gt;cfg&lt;/code&gt; для выбора правильной версии кода в зависимости
от целевой платформы: на &lt;code class=&quot;highlighter-rouge&quot;&gt;x86&lt;/code&gt; будет использоваться своя версия, а на &lt;code class=&quot;highlighter-rouge&quot;&gt;x86_64&lt;/code&gt; -
своя. Мы также можем выбирать и во время выполнения:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cp&quot;&gt;#[cfg(any(target_arch&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;x86&quot;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;target_arch&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;x86_64&quot;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;))]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;is_x86_feature_detected!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;avx2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo_avx2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nf&quot;&gt;foo_fallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Здесь у нас имеется две версии функции: одна использует &lt;code class=&quot;highlighter-rouge&quot;&gt;AVX2&lt;/code&gt; - специфический вид
SIMD, который позволяет выполнять 256-битные операции. Макрос &lt;code class=&quot;highlighter-rouge&quot;&gt;is_x86_feature_detected!&lt;/code&gt;
сгенерирует код, который проверит, поддерживает ли процессор AVX2, и если да,
то будет вызвана функция &lt;code class=&quot;highlighter-rouge&quot;&gt;foo_avx2&lt;/code&gt;. Если нет, то мы прибегнем к реализации без AVX,
&lt;code class=&quot;highlighter-rouge&quot;&gt;foo_fallback&lt;/code&gt;. Значит наш код будет работать очень быстро на процессорах,
поддерживающих AVX2, но также будет работать и на остальных процессорах, хотя и медленнее.&lt;/p&gt;

&lt;p&gt;Все это выглядит слегка низкоуровневым и неудобным - да, так и есть! &lt;code class=&quot;highlighter-rouge&quot;&gt;std::arch&lt;/code&gt; - это
именно &lt;em&gt;примитивы&lt;/em&gt; для такого рода вещей. Мы надеемся, что в будущем мы все-таки
стабилизируем модуль &lt;code class=&quot;highlighter-rouge&quot;&gt;std::simd&lt;/code&gt; с высокоуровневыми возможностями. Но появление базовых
возможностей работы с SIMD позволяет теперь экспериментировать с высокоуровневой поддержкой
различным библиотекам. Например, посмотрите пакет &lt;a href=&quot;https://github.com/AdamNiederer/faster&quot;&gt;faster&lt;/a&gt;.
Вот фрагмент кода без SIMD:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lots_of_3s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;123.456f32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;.map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;mf&quot;&gt;9.0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.recip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.ceil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;4.0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;2.0&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;.collect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Vec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;f32&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Для использования SIMD в этом коде с помощью &lt;code class=&quot;highlighter-rouge&quot;&gt;faster&lt;/code&gt;, вам потребуется изменить его так:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lots_of_3s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;123.456f32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.simd_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;.simd_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f32s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;f32s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;9.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.rsqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.ceil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f32s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;4.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f32s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;2.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;.scalar_collect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Он выглядит почти таким же: &lt;code class=&quot;highlighter-rouge&quot;&gt;simd_iter&lt;/code&gt; вместо &lt;code class=&quot;highlighter-rouge&quot;&gt;iter&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;simd_map&lt;/code&gt; вместо
&lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;f32s(2.0)&lt;/code&gt; вместо &lt;code class=&quot;highlighter-rouge&quot;&gt;2.0&lt;/code&gt;. Но в итоге вы получаете SIMD-версию вашего кода.&lt;/p&gt;

&lt;p&gt;Помимо &lt;em&gt;этого&lt;/em&gt;, вы можете никогда не писать такое сами, но, как всегда, это
могут делать библиотеки, от которых вы зависите. Например,
&lt;a href=&quot;https://github.com/rust-lang/regex/pull/456&quot;&gt;в пакет &lt;code class=&quot;highlighter-rouge&quot;&gt;regex&lt;/code&gt; уже добавили поддержку&lt;/a&gt;,
и его новая версия будет иметь SIMD-ускорение без необходимости вам вообще
что-либо делать!&lt;/p&gt;

&lt;h3 id=&quot;dyn-trait&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;dyn Trait&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;В конечном итоге мы пожалели о выбранном изначально синтаксисе типажей-объектов
в Rust. Как вы помните, для типажа &lt;code class=&quot;highlighter-rouge&quot;&gt;Foo&lt;/code&gt; можно так определить типаж-объект:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nb&quot;&gt;Box&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Однако, если &lt;code class=&quot;highlighter-rouge&quot;&gt;Foo&lt;/code&gt; - была бы структура, это означало бы просто размещение
структуры внутри &lt;code class=&quot;highlighter-rouge&quot;&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;. При разработке языка мы думали, что такое сходство
будет хорошей идеей, но опыт показал, что это приводит к путанице. И дело не
только в &lt;code class=&quot;highlighter-rouge&quot;&gt;Box&amp;lt;Trait&amp;gt;&lt;/code&gt;: &lt;code class=&quot;highlighter-rouge&quot;&gt;impl SomeTrait for SomeOtherTrait&lt;/code&gt; также является
формально корректным синтаксисом, но вам почти всегда требуется написать
&lt;code class=&quot;highlighter-rouge&quot;&gt;impl&amp;lt;T&amp;gt; SomeTrait for T where T: SomeOtherTrait&lt;/code&gt; вместо этого. То же самое
и с &lt;code class=&quot;highlighter-rouge&quot;&gt;impl SomeTrait&lt;/code&gt;, который выглядит так, будто добавляет методы или
возможную реализацию по умолчанию в типаж, но на самом деле он добавляет
собственные методы в типаж-объект. Наконец, по сравнению с недавно добавленным
синтаксисом &lt;code class=&quot;highlighter-rouge&quot;&gt;impl Trait&lt;/code&gt;, синтаксис &lt;code class=&quot;highlighter-rouge&quot;&gt;Trait&lt;/code&gt; выглядит короче и предпочтительней к
использованию, но на самом деле это не всегда верно.&lt;/p&gt;

&lt;p&gt;Поэтому в Rust 1.27 мы стабилизировали новый синтаксис &lt;a href=&quot;https://github.com/rust-lang/rfcs/blob/master/text/2113-dyn-trait-syntax.md&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;dyn Trait&lt;/code&gt;&lt;/a&gt;. Типажи-объекты
теперь выглядят так:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// было =&amp;gt; стало&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Box&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Box&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dyn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dyn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dyn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Foo&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Аналогично и для других типов-указателей: &lt;code class=&quot;highlighter-rouge&quot;&gt;Arc&amp;lt;Foo&amp;gt;&lt;/code&gt; теперь &lt;code class=&quot;highlighter-rouge&quot;&gt;Arc&amp;lt;dyn Foo&amp;gt;&lt;/code&gt; и т.д.
Из-за требования обратной совместимости мы не можем удалить старый синтаксис, но
мы добавили статическую проверку &lt;a href=&quot;https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html#bare-trait-object&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bare-trait-object&lt;/code&gt;&lt;/a&gt;, которая по умолчанию разрешает
старый синтаксис. Если вы хотите запретить его, то вы можете активировать данную
проверку. Мы подумали, что с проверкой, включенной по умолчанию, сейчас будет выводиться
слишком много предупреждений.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Кстати, мы работаем над инструментом под названием &lt;code class=&quot;highlighter-rouge&quot;&gt;rustfix&lt;/code&gt;, который сможет
автоматически обновлять ваш код до более новых идиом. Он будет использовать
подобные статические проверки для этого. Следите за сообщениями о &lt;code class=&quot;highlighter-rouge&quot;&gt;rustfix&lt;/code&gt;
в будущих анонсах.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;mustuse-dlia-funktsii&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;#[must_use]&lt;/code&gt; для функций&lt;/h3&gt;

&lt;p&gt;В заключении, было расширено действие атрибута &lt;code class=&quot;highlighter-rouge&quot;&gt;#[must_use]&lt;/code&gt;:
&lt;a href=&quot;https://github.com/rust-lang/rust/pull/48925/&quot;&gt;теперь он может использоваться для функций&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Раньше он применялся только к типам, таким как &lt;code class=&quot;highlighter-rouge&quot;&gt;Result &amp;lt;T, E&amp;gt;&lt;/code&gt;. Но теперь вы можете делать так:&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table style=&quot;border-spacing: 0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot; style=&quot;text-align: right&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;must_use&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;i32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;i32&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// warning: unused return value of `double` which must be used&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// (no warning)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;С этим атрибутом мы также &lt;a href=&quot;https://github.com/rust-lang/rust/pull/49533/&quot;&gt;слегка улучшили стандартную библиотеку&lt;/a&gt;:
&lt;code class=&quot;highlighter-rouge&quot;&gt;Clone::clone&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;Iterator::collect&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;ToOwned::to_owned&lt;/code&gt; будут выдавать предупреждения,
если вы не используете их возвращаемые значения, что поможет вам заметить дорогостоящие
операции, результат которых вы случайно игнорируете.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1270-2018-06-21&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;stabilizatsiia-bibliotiek&quot;&gt;Стабилизация библиотек&lt;/h3&gt;

&lt;p&gt;В этом выпуске были стабилизированы следующие новые API:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfind&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;DoubleEndedIterator::rfind&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.rfold&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;DoubleEndedIterator::rfold&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.try_rfold&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;DoubleEndedIterator::try_rfold&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_micros&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Duration::from_micros&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Duration.html#method.from_nanos&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Duration::from_nanos&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_micros&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Duration::subsec_micros&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/time/struct.Duration.html#method.subsec_millis&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Duration::subsec_millis&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.remove_entry&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;HashMap::remove_entry&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_fold&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Iterator::try_fold&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.try_for_each&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Iterator::try_for_each&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/ptr/struct.NonNull.html#method.cast&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;NonNull::cast&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/option/enum.Option.html#method.filter&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Option::filter&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/string/struct.String.html#method.replace_range&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;String::replace_range&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/io/struct.Take.html#method.set_limit&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Take::set_limit&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/hint/fn.unreachable_unchecked.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;hint::unreachable_unchecked&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/os/unix/process/fn.parent_id.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;os::unix::process::parent_id&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/process/fn.id.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;process::id&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/ptr/fn.swap_nonoverlapping.html&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ptr::swap_nonoverlapping&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit_mut&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;slice::rsplit_mut&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.slice.html#method.rsplit&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;slice::rsplit&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/std/primitive.slice.html#method.swap_with_slice&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;slice::swap_with_slice&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1270-2018-06-21&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;uluchshieniia-v-cargo&quot;&gt;Улучшения в Cargo&lt;/h3&gt;

&lt;p&gt;В этом выпуске Cargo получил два небольших улучшения. Во-первых,
появился &lt;a href=&quot;https://github.com/rust-lang/cargo/pull/5393/&quot;&gt;новый флаг &lt;code class=&quot;highlighter-rouge&quot;&gt;--target-dir&lt;/code&gt;&lt;/a&gt;,
который можно использовать для изменения целевой директории выполнения.&lt;/p&gt;

&lt;p&gt;Дополнительно, доработан подход Cargo к тому, как обрабатывать цели. Cargo
пытается обнаружить тесты, примеры и исполняемые файлы в рамках вашего
проекта. Однако иногда требуется явная конфигурация. Но в первоначальной
реализации это сделать было проблематично. Скажем, у вас есть два примера,
и Cargo их оба обнаруживает. Вы хотите сконфигурировать один из них, для чего
добавляете &lt;code class=&quot;highlighter-rouge&quot;&gt;[[example]]&lt;/code&gt; в &lt;code class=&quot;highlighter-rouge&quot;&gt;Cargo.toml&lt;/code&gt;, чтобы указать параметры примера.
В настоящее время Cargo увидит, что вы определили пример явно, и поэтому не
будет пытаться делать автоматическое определение других. Это слегка огорчает.&lt;/p&gt;

&lt;p&gt;Поэтому мы &lt;a href=&quot;https://github.com/rust-lang/cargo/pull/5335/&quot;&gt;добавили несколько ‘auto’-ключей в &lt;code class=&quot;highlighter-rouge&quot;&gt;Cargo.toml&lt;/code&gt;&lt;/a&gt;.
Мы не можем исправить такое поведение без возможной поломки проектов, которые
по неосторожности на него полагались. Поэтому если вы хотите сконфигурировать
некоторые цели, но не все, вы можете установить ключ &lt;code class=&quot;highlighter-rouge&quot;&gt;autoexamples&lt;/code&gt; в &lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;
в секции &lt;code class=&quot;highlighter-rouge&quot;&gt;[package]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Подробности смотрите &lt;a href=&quot;https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1270-2018-06-21&quot;&gt;в примечаниях к выпуску&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;razrabotchiki-1270&quot;&gt;Разработчики 1.27.0&lt;/h2&gt;

&lt;p&gt;Множество людей участвовало в разработке Rust 1.27. Мы не смогли бы
завершить работу без участия каждого из вас.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://thanks.rust-lang.org/rust/1.27.0&quot;&gt;Спасибо!&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 21 Jun 2018 00:00:00 +0000</pubDate>
        <link>https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/06/21/rust-1.27.html</link>
        <guid isPermaLink="true">https://rustycrate.ru/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8/2018/06/21/rust-1.27.html</guid>
        
        
        <category>новости</category>
        
      </item>
    
  </channel>
</rss>
