Определение модуля во внешнем файле

Последнее обновление: 02.06.2024

Обычно модули определяются в отдельных файлах. Для подключения внешнего файла применяется оператор mod, после которого указывается имя файла (без расширения .rs):

mod внешний_файл;

Рассмотрим, как определить модуль во внешнем файле и подключить его. Но прежде всего стоит отметить, как Rust ищет модули. Например, мы хотим использовать некоторый модуль "messages". Тогда Rust будет искать этот модуль в следующих местах:

  • В фигурных скобках непосредственно за определением mod messages

  • В файле messages.rs

  • В файле messages/mod.rs

Определение модуля с помощью mod

Первый способ в принципе рассматривался в прошлых статьях, когда модули определялись в одном файле. Например, у нас есть следующий файл main.rs:

mod messages{
     
    pub fn print_hello(){ println!("Hello METANIT.COM!"); }
    pub fn print_message(mes:&str){ println!("{mes}"); }
}
fn main(){
    messages::print_hello();
    messages::print_message("Hello World");
}

ПРи обращении к функции messages::print_hello()

Определение в отдельном файле

Пусть у нас в проекте есть файл messages.rs со следующим кодом:

pub fn print_hello(){ println!("Hello METANIT.COM!"); }
pub fn print_message(mes:&str){ println!("{mes}"); }

Обратите внимание, что здесь не используется слово mod, то есть модуль явным образом никак не объявляется. А файл main.rs выглядит следующим образом:

mod messages;

fn main(){
    messages::print_hello();
    messages::print_message("Hello World");
}

Здесь директива mod messages; в начале файла указывает компилятору включить в текущий файл код из "messages.rs".

Определение в файле mod.rs

Пусть у нас в проекте есть папка messages, в которой расположен файл mod.rs со следующим кодом:

pub fn print_hello(){ println!("Hello METANIT.COM!"); }
pub fn print_message(mes:&str){ println!("{mes}"); }

А файл main.rs выглядит следующим образом:

mod messages;

fn main(){
    messages::print_hello();
    messages::print_message("Hello World");
}

Фактически этот способ мало чем отличается от предыдущего, только вместо файла "messages.rs" используется файл "messages/mod.rs".

Но в любом случае мы могли бы использовать оператор use для импорта функциональности модуля в файл:

mod messages;
use messages::{print_hello, print_message}; // импортируем функции модуля

fn main(){
    print_hello();
    print_message("Hello World2");
}

Подключение вложенных модулей

Подключение вложенных модулей во многом аналогично, только учитывает пути внутри модуля и проецирует их на файловую систему. Например, в модуле "messages" у нас есть вложенный модуль "hello". В этом случае Rust будет искать функциональность модуля по следующим путям:

  • В фигурных скобках непосредственно за определением mod messages

  • В файле messages/hello.rs

  • В файле messages/hello/mod.rs

Сначала рассмотрим первый способ. Пусть у нас есть файл main.rs со следующим кодом:

mod messages{
     
    pub fn print_message(mes:&str){ println!("{mes}"); }
    pub mod hello{

        pub fn print_en(){ println!("Hello!"); }
        pub fn print_ru(){ println!("Привет"); }
    }
}
fn main(){
    messages::hello::print_en();
    messages::hello::print_ru();
    messages::print_message("Hello World");
}

В модуле hello определены две функции: print_en и print_ru, и используя пути типа "messages::hello::print_en", мы можем обращаться к подобным функциям.

Как писалось выше, мы можем весть код модуля поместить в одноименном файле - файле messages.rs:

pub fn print_message(mes:&str){ println!("{mes}"); }
pub mod hello{

    pub fn print_en(){ println!("Hello!"); }
    pub fn print_ru(){ println!("Привет"); }
}

А затем подключить в файл main.rs:

mod messages;		// добавляем модуль

fn main(){
    messages::hello::print_en();
    messages::hello::print_ru();
    messages::print_message("Hello World3");
}

Вынесение модуля в отдельную папку

Теперь рассмотрим второй способ с помещением модуля в отдельную папку (трейти способ будет во многом аналогичен). Пусть у нас проект выглядит следующим образом:

  • Файл main.rs

  • Папка messages

    • Файл hello.rs

    • Файл mod.rs

Итак, в проекте есть папка messages, в которой хранится весь функционал модуля "messages". Весь функционал вложенного модуля расположен в файле hello.rs со следующим кодом:

pub fn print_en(){ println!("Hello!"); }
pub fn print_ru(){ println!("Привет"); }

Кроме того, у нас в модуле есть функционал, который не входит в модуль hello - функция print_message. Ее, как и другой общий для всего модуля messages функционал, помещаем в файл mod.rs:

pub mod hello;	// подключение вложенного модуля

pub fn print_message(mes:&str){ println!("{mes}"); }

Обратите внимание, что здесь идет подключение вложенного модуля hello. Причем для видимости из вне он подключается с помощью слова pub.

Далее в файле main.rs подключаем модуль "messages":

mod messages;

fn main(){
    messages::hello::print_en();
    messages::hello::print_ru();
    messages::print_message("Hello World4");
}
Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850