Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Дерево модулей

Если не писать содержимое модуля, Rust будет искать его в другом файле:

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

mod garden;

Это сообщает Rust, что содержимое модуля garden находится в файле garden.rs в том же каталоге, что и файл, объявивший модуль. Если модуль garden аналогично объявляет подмодуль vegetables, его содержимое будет находиться в garden/vegetables.rs.

Корень крейта находится в:

  • src/lib.rs (для библиотечного крейта)
  • src/main.rs (для бинарного крейта)

Это отправная точка, с которой компилятор определяет дополнительные модули.

Модули, определённые в файлах, тоже можно документировать с помощью «внутренних doc-комментариев». Они документируют элемент, который их содержит, в данном случае — модуль.

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

//! Этот модуль реализует сад, включая высокопроизводительную
//! реализацию прорастания семян.

// Объявляем подмодули.
mod plant;
mod seeds;

// Реэкспортируем типы из этого модуля.
pub use plant::Plant;
pub use seeds::SeedPacket;

pub struct Garden {
    plants: Vec<Plant>,
}

/// Сеет заданные пакеты семян.
pub fn sow(seeds: Vec<SeedPacket>) {
    todo!()
}

/// Собирает готовые к сбору овощи и фрукты в саду.
pub fn harvest(garden: &mut Garden) {
    todo!()
}
This slide should take about 5 minutes.
  • До Rust 2018 модули нужно было размещать в module/mod.rs, а не в module.rs, и это по-прежнему рабочий вариант для редакций после 2018 года.

  • Основная причина ввести filename.rs как альтернативу filename/mod.rs в том, что много файлов с именем mod.rs может быть трудно различить в IDE.

  • Для более глубокой вложенности можно использовать каталоги, даже если главный модуль — файл:

    src/
    ├── main.rs
    ├── top_module.rs
    └── top_module/
        └── sub_module.rs
    
  • Место, где Rust будет искать модули, можно изменить с помощью директивы компилятора:

    // Copyright 2022 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    #[path = "some/path.rs"]
    mod some_module;

    Это полезно, например, если вы хотите поместить тесты модуля в файл с именем some_module_test.rs, по аналогии с соглашением в Go.