Структура проекта
Крейт
Крейт — это наименьший объем кода, который компилятор Rust рассматривает за раз. Даже если вы запустите rustc вместо cargo и передадите один файл с исходным кодом (как мы уже делали в разделе «Написание и запуск программы на Rust» Главы 1), компилятор считает этот файл крейтом. Крейты могут содержать модули, и модули могут быть определены в других файлах, которые компилируются вместе с крейтом, как мы увидим в следующих разделах.
Бинарные крейты — это программы, которые вы можете скомпилировать в исполняемые файлы, которые вы можете запускать, например программу командной строки или сервер.
Библиотечные крейты не имеют функции main и не компилируются в исполняемый файл. Вместо этого они определяют функциональность, предназначенную для совместного использования другими проектами.
Корневой модуль крейта — это исходный файл, из которого компилятор Rust начинает собирать корневой модуль вашего крейта
Пакет
Пакет — это набор из одного или нескольких крейтов, предоставляющий набор функциональности. Пакет содержит файл Cargo.toml, в котором описывается, как собирать эти крейты.
Пакет может содержать сколько угодно бинарных крейтов, но не более одного библиотечного крейта. Пакет должен содержать хотя бы один крейт, библиотечный или бинарный.
$ cargo new my-project
Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs
Модули
- при компиляции компилятор сначала ищет корневой модуль крейта (обычно это src/lib.rs для библиотечного крейта или src/main.rs для бинарного крейта) для компиляции кода.
- В файле корневого модуля крейта вы можете объявить новые модули с помощью
mod <имя модуля>; - Компилятор будет искать код модуля в следующих местах:
- в этом же файле, между фигурных скобок, которые заменяют точку с запятой после
mod <имя модуля> - в файле
src/<имя модуля>.rs - в файле
src/<имя модуля>/mod.rs
- в этом же файле, между фигурных скобок, которые заменяют точку с запятой после
Подмодули
В любом файле, кроме корневого модуля крейта, вы можете объявить подмодули.
Компилятор будет искать код подмодуля в каталоге с именем родительского модуля в следующих местах:
- в этом же файле, сразу после
mod <имя подмодуля>, между фигурных скобок, которые заменяют точку с запятой - в файле
src/<имя модуля>/<имя подмодуля>.rs - в файле
src/<имя модуля>/<имя подмодуля>/mod.rs
Пути к коду в модулях
тип Asparagus, в подмодуле vegetables модуля garden, будет найден по пути crate::garden::vegetables::Asparagus.
Объявление модуля
#![allow(unused)] fn main() { mod name //объявление модуля pub mod name //объявление публичного модуля }
Ключевое слово use
использование ключевого слова use создаёт псевдонимы для элементов
use crate::garden::vegetables::Asparagus позволяет использовать в коде просто Asparagus
backyard
├── Cargo.lock
├── Cargo.toml
└── src
├── garden
│ └── vegetables.rs
├── garden.rs
└── main.rs
use crate::garden::vegetables::Asparagus; pub mod garden; fn main() { let plant = Asparagus {}; println!("I'm growing {plant:?}!"); }
Код внутри модуля по умолчанию закрытый и обеспечивает приватность