Исправление кода с rustfix Инструмент rustfix включён в установку Rust и может автоматически исправлять предупреждения компилятора с очевидным способом исправления проблемы, скорее всего, подходящим вам. Вероятно, вы уже видели предупреждения компилятора. Например, рассмотрим этот код: Файл: src/main.rs $ rustup component add rustfmt $ cargo fmt fn do_something () {} fn main () { for i in 0 100 { do_something(); } }
Мы вызываем функцию do_something 100 раз, но никогда не используем переменную i в теле цикла for . Rust предупреждает нас об этом: Предупреждение предлагает нам использовать _i как имя переменной: нижнее подчёркивание в начале идентификатора предполагает, что мы его не используем. Мы можем автоматически применить это предположение с помощью rustfix , запустив команду cargo fix : Когда посмотрим в src/main.rs снова, мы увидим что cargo fix изменил наш код: Файл: src/main.rs Переменная цикла for теперь носит имя _i , и предупреждение больше не появляется. Также Вы можете использовать команду cargo fix для перемещения вашего кода между различными редакциями Rust. Редакции будут рассмотрены в дополнении Д. Больше проверок с Clippy Инструмент Clippy является коллекцией проверок (lints) для анализа Вашего кода, поэтому Вы можете найти простые ошибки и улучшить ваш Rust код. Для установки Clippy, введите следующее: $ cargo build Compiling myprogram v0.1.0 (file:///projects/myprogram) warning: unused variable: `i` --> src/main.rs:4:9 | 4 | for i in 0..100 { | ^ help: consider using `_i` instead | = note: #[warn(unused_variables)] on by default Finished dev [unoptimized + debuginfo] target(s) in 0.50s $ cargo fix Checking myprogram v0.1.0 (file:///projects/myprogram) Fixing src/main.rs (1 fix) Finished dev [unoptimized + debuginfo] target(s) in 0.59s fn do_something () {} fn main () { for _i in 0 100 { do_something(); } }
Для запуска проверок Clippy’s для проекта Cargo, введите следующее: Например, скажем что Вы хотите написать программу, в которой будет использоваться приближенная математическая константа, такая как число Пи, как в следующей программе: Файл: src/main.rs Запуск cargo clippy для этого проекта вызовет следующую ошибку: Эта ошибка сообщает вам, что в Rust уже определена более точная константа PI , и что ваша программа будет более корректной, если вы вместо неё будете использовать эту константу. Затем вы должны изменить свой код, чтобы использовать константу PI Следующий код не приводит к ошибкам или предупреждениям от Clippy: Файл: src/main.rs Для большей информации о Clippy смотрите документацию Интеграция с IDE с помощью rust-analyzer $ rustup component add clippy $ cargo clippy fn main () { let x = 3.1415 ; let r = 8.0 ; println! ( "the area of the circle is {}" , x * r * r); } error: approximate value of `f{32, 64}::consts::PI` found. Consider using it directly --> src/main.rs:2:13 | 2 | let x = 3.1415; | ^^^^^^ | = note: #[deny(clippy::approx_constant)] on by default = help: for further information visit https://rust-lang-nursery.github.io/rust- clippy/master/index.html#approx_constant fn main () { let x = std:: f64 ::consts::PI; let r = 8.0 ; println! ( "the area of the circle is {}" , x * r * r); }
Чтобы облегчить интеграцию с IDE, сообщество Rust рекомендует использовать rust- analyzer . Этот инструмент представляет собой набор ориентированных на компилятор утилит, которые используют Language Server Protocol , который является спецификацией для взаимодействия IDE и языков программирования друг с другом. Разные клиенты могут использовать rust-analyzer , например подключаемый модуль анализатора Rust для Visual Studio Code Посетите домашнюю страницу проекта rust-analyzer для получения инструкций по установке, а затем установите поддержку языкового сервера в вашей конкретной среде IDE. Ваша IDE получит такие возможности, как автодополнение, переход к определению и встроенные ошибки. Приложение E - Редакции языкаВ главе 1, можно увидеть, что команда cargo new добавляет некоторые мета-данные о редакции языка в файл Cargo.toml. Данное приложение рассказывает, что они означают. Язык Rust и его компилятор имеют шестинедельный цикл выпуска, означающий, что пользователи постоянно получают новые функции. В других языках обычно выпускают большие обновления, но редко. Команда Rust выпускает меньшие обновления, но более часто. Через некоторое время все эти небольшие изменения накапливаются. Между релизами обычно сложно оглянуться назад и сказать "Ого, язык сильно изменился между версиями Rust 1.10 и Rust 1.31!" Каждые два или три года, команда Rust выпускает новую редакцию языка (Rust edition). Каждая редакция объединяет все новые особенности, которые попали в язык с новыми пакетами, с полной, обновлённой документацией и инструментарием. Новые редакции поставляются как часть шестинедельного процесса релизов. Для разных людей редакции служат разным целям: Для активных пользователей новая редакция приносит все инкрементальные изменения в удобный и понятный пакет. Для тех, кто языком не пользуется, новая реакция является сигналом, что некоторые важные улучшения, на которые возможно надо взглянуть ещё раз, попали в язык. Для тех кто разрабатывает на Rust, новая редакция даёт некоторую точку отсчёта для проекта в целом. На момент написания доступны две редакции Rust: Rust 2015 и Rust 2018. Данная книга написана с использованием идиом редакции Rust 2018. Ключ edition в конфигурационном файле Cargo.toml отображает, какую редакцию компилятор должен использовать для вашего кода. Если ключа нет, то для обратной совместимости компилятор Rust использует редакцию 2015 Любой проект может выбрать редакцию отличную от редакции по умолчанию, которая равна 2015. Редакции могут содержать несовместимые изменения, включая новые ключевые слова, которые могут конфликтовать с идентификаторами в коде. Однако, пока вы не переключитесь на новую редакцию, ваш код будет продолжать компилироваться даже после обновления используемой версии компилятора. Все версии компилятора Rust поддерживают любую редакцию, которая предшествовала выпуску текущей, и они могут линковать пакеты любой поддерживаемой редакции. Изменения редакций действуют только на способ начального разбора компилятором исходного кода. Поэтому, если вы используете 2015 редакцию, а одна из ваших зависимостей использует 2018, ваш проект будет скомпилирован и сможет пользоваться этой зависимостью. Обратная ситуация, когда ваш проект использует Rust 2018, а зависимость использует Rust 2015, работает таким же образом. Внесём ясность: большая часть возможностей будет доступна во всех редакциях. Разработчики, использующие любую редакцию Rust, будут продолжать получать улучшения по мере выпуска новых релизов. Однако в некоторых случаях, в основном, когда добавляются новые ключевые слова, некоторые новые возможности могут быть доступны только в последних редакциях. Нужно переключить редакцию, чтобы воспользоваться новыми возможностями. Для получения больше деталей, есть полная книга Edition Guide про редакции, в которой перечисляются различия между редакциями и объясняется, как автоматически обновить свой код на новую редакцию с помощью команды cargo fix Приложение Е: Переводы книги Для ресурсов на языках, отличных от английского. Большинство из них все ещё в разработке; см. ярлык «Переводы» , чтобы помочь или сообщить нам о новом переводе! Português (BR) Português (PT) 简体中⽂ 正體中⽂ Українська Español , alternate Italiano Русский 한국어 ⽇本語 Français Polski Cebuano Tagalog Esperanto ελληνική Svenska Farsi Deutsch Turkish , online हदी ไทย Danske
Дополнение Ё - Как создаётся Rust и “Nightly Rust”Это дополнение рассказывает как создаётся Rust, и как это влияет на Вас как на разработчика. Стабильность без стагнацииКак язык, Rust много заботиться о стабильности Вашего кода. Мы хотим чтобы Rust был прочным фундаментом, вашей опорой, и если бы все постоянно менялось, это было бы невозможно. В то же время, если мы не можем экспериментировать с различными возможностями, мы не можем обнаружить важные проблемы до релиза, когда мы не можем их изменить. Нашим решением проблемы является “стабильность без стагнации”, и наш руководящий принцип: Вы никогда не должны бояться перехода на новую стабильную версию Rust. Каждое обновление должно быть безболезненным, но также должно добавлять новые функции, меньше дефектов и более быструю скорость компиляции. Ту-ту! Каналы выпуска и поездка на поездеРазработка языка Rust работает по принципу расписания поездов. То есть, вся разработка совершается в ветке master Rust репозитория. Выпуски следуют модели последовательного выпуска продукта (software release train), которая была использована Cisco IOS и другими программными продуктами. Есть три канала выпуска Rust: Ночной (Nightly) Бета (Beta) Стабильный (Stable) Большинство Rust разработчиков используют стабильную версию, но те кто хотят попробовать экспериментальные новые функции, должны использовать Nightly или Beta. Приведём пример, как работает процесс разработки и выпуска новых версий. Давайте предположим, что команда Rust работает над версией Rust 1.5. Его релиз состоялся в декабре 2015 года, но это даст реалистичность номера версии. Была добавлена новая функциональность в Rust: новые коммиты в ветку master . Каждую ночь выпускается новая ночная версия Rust. Каждый день является днём выпуска ночной версии и эти выпуски создаются нашей структурой автоматически. По мере того как идёт время, наши выпуски выглядят так: Каждые шесть недель наступает время подготовки новой Beta версии! Ветка beta Rust репозитория ответвляется от ветки master , используемой версией Nightly. Теперь мы nightly: * - - * - - * имеем два выпуска: Многие пользователи Rust не используют активно бета-версию, но тестируют бета- версию в их системе CI для помощи Rust обнаружить проблемы обратной совместимости. В это время каждую ночь выпускается новая версия Nightly: Предположим, что была найдена регрессия. Хорошо, что мы можем протестировать бета- версию перед тем как регрессия попала в стабильную версию! Исправление отправляется в ветку master , поэтому версия nightly исправлена и затем исправление также направляется в ветку beta , и происходит новый выпуск бета-версии: Через шесть недель после выпуска бета-версии, наступает время для выпуска стабильной версии! Ветка stable создаётся из ветки beta : Ура! Rust 1.5 выпущена! Но мы также забыли про одну вещь: так как прошло шесть недель, мы должны выпустить бета-версию следующей версии Rust 1.6. Поэтому после ответвления ветки stable из ветки beta , следующая версия beta ответвляется снова от nightly : Это называется “модель поезда” (train model), потому что каждые шесть недель выпуск “покидает станцию”, но ему все ещё нужно пройти канал beta, чтобы попасть в стабильную версию. Rust выпускается каждые шесть недель, как часы. Если вы знаете дату одного выпуска Rust, вы знаете дату выпуска следующего: это шесть недель позднее. Хорошим аспектом nightly: * - - * - - * | beta: * nightly: * - - * - - * - - * - - * | beta: * nightly: * - - * - - * - - * - - * - - * | beta: * - - - - - - - - * nightly: * - - * - - * - - * - - * - - * - * - * | beta: * - - - - - - - - * | stable: * nightly: * - - * - - * - - * - - * - - * - * - * | | beta: * - - - - - - - - * * | stable: *
выпуска версий каждые шесть недель является то, что следующий поезд прибывает скоро. Если какая-то функция не попадает в релиз, не надо волноваться: ещё один выпуск произойдёт очень скоро! Это помогает снизить давление в случае если функция возможно не отполирована к дате выпуска. Благодаря этому процессу, вы всегда можете посмотреть следующую версию Rust и убедиться, что на неё легко будет перейти: если бета-выпуск будет работать не так как ожидалось, вы можете сообщить об этом разработчикам и он будет исправлен перед выпуском стабильной версии! Поломки в бета-версии случаются относительно редко, но rustc все ещё является частью программного обеспечения, поэтому дефекты все ещё существуют. Нестабильные функцииУ этой модели выпуска есть ещё один плюс: нестабильные функции. Rust использует технику называемую “флаги функционала” (feature flags) для определения функций, которые были включены в выпуске. Если новая функция находится в активной разработке, она попадает в ветку master , и поэтому попадает в ночную версию, но с флагом функции (feature flag). Если как пользователь, вы хотите попробовать работу такой функции, находящейся в разработке, вы должны использовать ночную версию Rust и указать в вашем исходном коде определённый флаг. Если вы используете бета или стабильную версию Rust, Вы не можете использовать флаги функций. Этот ключевой момент позволяет использовать на практике новые возможности перед их стабилизацией. Это может использоваться желающими идти в ногу со временем, а другие могут использовать стабильную версию и быть уверенными что их код не сломается. Стабильность без стагнации. Эта книга содержит информацию только о стабильных возможностях, так как разрабатываемые возможности продолжают меняться в процессе и несомненно они будут отличаться в зависимости от того, когда эта книга написана и когда эти возможности будут включены в стабильные сборки. Вы можете найти информацию о возможностях ночной версии в интернете. Rustup и роль ночной версии RustRustup делает лёгким изменение между различными каналами Rust, на глобальном или локальном для проекта уровне. По умолчанию устанавливается стабильная версия Rust. Для установки ночной версии выполните команду: Вы можете также увидеть все установленные инструменты разработчика (toolchains)(версии Rust и ассоциированные компоненты) с помощью rustup . Это пример вывода у $ rustup toolchain install nightly одного из авторов Rust с компьютером на Windows: Как видите, стабильный набор инструментов (toolchain) используется по умолчанию. Большинство пользователей Rust используют стабильные версии большую часть времени. Возможно, вы захотите использовать стабильную большую часть времени, но использовать каждую ночную версию в конкретном проекте, потому что заботитесь о передовых возможностях. Для этого вы можете использовать команду rustup override в каталоге этого проекта, чтобы установить ночной набор инструментов, должна использоваться команда rustup , когда вы находитесь в этом каталоге: Теперь каждый раз, когда вы вызываете rustc или cargo внутри /projects/needs-nightly, rustup будет следить за тем, чтобы вы используете ночную версию Rust, а не стабильную по умолчанию. Это очень удобно, когда у вас есть множество Rust проектов! Процесс RFC и командыИтак, как вы узнаете об этих новых возможностях? Модель разработки Rust следует процессу запроса комментариев (RFC - Request For Comments). Если хотите улучшить Rust, вы можете написать предложение, которое называется RFC. Любой может написать RFC для улучшения Rust, предложения рассматриваются и обсуждаются командой Rust, которая состоит из множества тематических подгрупп. На веб-сайте Rust есть полный список команд, который включает команды для каждой области проекта: дизайн языка, реализация компилятора, инфраструктура, документация и многое другое. Соответствующая команда читает предложение и комментарии, пишет некоторые собственные комментарии и в конечном итоге, приходит к согласию принять или отклонить эту возможность. Если новая возможность принята и кто-то может реализовать её, то задача открывается в репозитории Rust. Человек реализующий её, вполне может не быть тем, кто предложил эту возможность! Когда реализация готова, она попадает в master ветвь с флагом функции, как мы обсуждали в разделе "Нестабильных функциях" Через некоторое время, разработчики Rust использующие ночные выпуски, смогут опробовать новую возможность, члены команды обсудят её, как она работает в ночной версии и решат, должна ли она попасть в стабильную версию Rust или нет. Если принимается решение двигать её вперёд, ограничение функции с помощью флага > rustup toolchain list stable-x86_64-pc-windows-msvc (default) beta-x86_64-pc-windows-msvc nightly-x86_64-pc-windows-msvc $ cd /projects/needs-nightly $ rustup override set nightly |