По умолчанию, элементы модуля являются приватными,
но это можно изменить добавив модификатор pub.
Только публичные элементы модуля могут быть доступны за пределами его области видимости.
// Модуль по имени `my`
mod my {
// Все элементы модуля по умолчанию являются приватными.
fn private_function() {
println!("вызвана `my::private_function()`");
}
// Используем модификатор `pub`, чтобы сделать элемент публичным.
pub fn function() {
println!("вызвана `my::function()`");
}
// Приватные элементы модуля доступны другим элементам
// данного модуля.
pub fn indirect_access() {
print!("вызвана `my::indirect_access()`, that\n> ");
private_function();
}
// Модули так же могут быть вложенными
pub mod nested {
pub fn function() {
println!("вызвана `my::nested::function()`");
}
#[allow(dead_code)]
fn private_function() {
println!("вызвана `my::nested::private_function()`");
}
}
// Вложенные модули подчиняются тем же правилам видимости
mod private_nested {
#[allow(dead_code)]
pub fn function() {
println!("вызвана `my::private_nested::function()`");
}
}
}
fn function() {
println!("вызвана `function()`");
}
fn main() {
// Модули позволяют устранить противоречия между элементами, которые имеют одинаковые названия.
function();
my::function();
// Публичные элементы, включая те, что находятся во вложенном модуле,
// доступны извне родительского модуля
my::indirect_access();
my::nested::function();
// Приватные элементы модуля не доступны напрямую,
// даже если вложенный модуль является публичным:
// Ошибка! функция `private_function` приватная
//my::private_function();
// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку
// Ошибка! функция `private_function` приватная
//my::nested::private_function();
// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку
// Ошибка! Модуль `private_nested` является приватным
//my::private_nested::function();
// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку
}