Структура проекта

Крейт

Крейт — это наименьший объем кода, который компилятор 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:?}!");
}

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