Обычно модули определяются в отдельных файлах. Для подключения внешнего файла применяется оператор mod, после которого указывается имя файла (без расширения .rs):
mod внешний_файл;
Рассмотрим, как определить модуль во внешнем файле и подключить его. Но прежде всего стоит отметить, как Rust ищет модули. Например, мы хотим использовать некоторый модуль "messages". Тогда Rust будет искать этот модуль в следующих местах:
В фигурных скобках непосредственно за определением mod messages
В файле messages.rs
В файле messages/mod.rs
Первый способ в принципе рассматривался в прошлых статьях, когда модули определялись в одном файле. Например, у нас есть следующий файл 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".
Пусть у нас в проекте есть папка 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");
}