Видимость модуля
Видимость модуля - это механизм, который определяет,
какие элементы (функции, структуры, модули, константы)
доступны из других частей программы. По умолчанию
все элементы в Rust являются приватными и доступны
только внутри своего модуля. Ключевое слово pub
делает элемент публичным, а такие модификаторы,
как pub(crate) и pub(super), позволяют
гибко настраивать область видимости.
Синтаксис
pub fn function_name() {}
pub struct StructName {}
pub mod module_name {}
pub(crate) fn function_name() {}
pub(super) fn function_name() {}
Пример
Давайте создадим модуль с приватной и публичной функциями и попробуем вызвать их из другого модуля:
mod my_module
{
pub fn public_function()
{
println!("public");
}
fn private_function()
{
println!("private");
}
}
fn main()
{
my_module::public_function();
}
Результат выполнения кода:
"public"
Пример
Давайте попробуем вызвать приватную функцию из другого модуля и убедимся, что это вызовет ошибку:
mod my_module
{
fn private_function()
{
println!("private");
}
}
fn main()
{
my_module::private_function();
}
Компилятор выдаст ошибку, так как функция
private_function является приватной
и недоступна за пределами своего модуля.
Пример
Давайте используем модификатор pub(crate),
чтобы сделать функцию доступной во всём крейте,
но не за его пределами:
mod my_module
{
pub(crate) fn crate_function()
{
println!("crate");
}
}
fn main()
{
my_module::crate_function();
}
Результат выполнения кода:
"crate"
Пример
Давайте используем модификатор pub(super),
чтобы сделать функцию доступной только
в родительском модуле:
mod outer
{
pub mod inner
{
pub(super) fn super_function()
{
println!("super");
}
}
pub fn call_super_function()
{
inner::super_function();
}
}
fn main()
{
outer::call_super_function();
}
Результат выполнения кода:
"super"
Смотрите также
-
раздел
Видимость,
который описывает общие правила видимости элементов -
модификатор
pub(crate),
который открывает доступ в пределах всего крейта -
модификатор
pub(super),
который открывает доступ в родительском модуле -
концепция
Владение,
которая тесно связана с организацией модулей