Модульное оформление файлов в Rust

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом лабораторном задании иерархия файлов модулей в примере кода может быть представлена следующим образом: есть директория с именем "my", которая содержит два файла: "inaccessible.rs" и "nested.rs". Кроме того, есть файл с именем "my.rs" и файл с именем "split.rs". Файл "split.rs" включает модуль "my", определенный в файле "my.rs", а файл "my.rs" включает модули "inaccessible" и "nested", определенные в файлах "inaccessible.rs" и "nested.rs" соответственно.

Примечание: Если лабораторная работа не уточняет имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

Иерархия файлов

Модули могут быть сопоставлены иерархии файлов/директорий. Рассмотрим пример видимости в файлах:

$ tree.
.
├── my
│   ├── inaccessible.rs
│   └── nested.rs
├── my.rs
└── split.rs

В split.rs:

// Эта декларация будет искать файл с именем `my.rs` и
// вставлять его содержимое внутри модуля с именем `my` в этом контексте
mod my;

fn function() {
    println!("called `function()`");
}

fn main() {
    my::function();

    function();

    my::indirect_access();

    my::nested::function();
}

В my.rs:

// Аналогично `mod inaccessible` и `mod nested` будут искать файлы `nested.rs`
// и `inaccessible.rs` и вставлять их здесь под соответствующими
// модулями
mod inaccessible;
pub mod nested;

pub fn function() {
    println!("called `my::function()`");
}

fn private_function() {
    println!("called `my::private_function()`");
}

pub fn indirect_access() {
    print!("called `my::indirect_access()`, that\n> ");

    private_function();
}

В my/nested.rs:

pub fn function() {
    println!("called `my::nested::function()`");
}

#[allow(dead_code)]
fn private_function() {
    println!("called `my::nested::private_function()`");
}

В my/inaccessible.rs:

#[allow(dead_code)]
pub fn public_function() {
    println!("called `my::inaccessible::public_function()`");
}

Проверим, что все по-прежнему работает как прежде:

$ rustc split.rs &&./split
called `my::function()`
called `function()`
called `my::indirect_access()`, that
> called `my::private_function()`
called `my::nested::function()`

Резюме

Поздравляем! Вы завершили лабораторную работу по иерархии файлов. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.