Ключевое слово super
Ключевое слово super используется внутри модулей
для доступа к элементам родительского модуля. Оно работает
по аналогии с self, но если self ссылается
на текущий модуль, то super ссылается на модуль
уровнем выше. С помощью super можно обращаться
к функциям, структурам, константам и другим элементам,
объявленным в родительском модуле.
Ключевое слово super можно использовать
несколько раз подряд, например super::super,
чтобы подняться на два уровня вверх по иерархии модулей.
Также его можно комбинировать с self
и crate для построения полных путей к элементам.
Синтаксис
super::item
super::super::item
super::{item1, item2}
Пример
Давайте создадим родительский модуль parent
с функцией hello и вызовем её из дочернего
модуля child через super:
mod parent
{
pub fn hello()
{
println!("Hello from parent");
}
pub mod child
{
pub fn call_parent()
{
super::hello();
}
}
}
fn main()
{
parent::child::call_parent();
}
Результат выполнения кода:
"Hello from parent"
Пример
Давайте обратимся к константе родительского модуля
из дочернего модуля с помощью super:
mod outer
{
pub const VALUE: i32 = 42;
pub mod inner
{
pub fn get_value() -> i32
{
super::VALUE
}
}
}
fn main()
{
let res = outer::inner::get_value();
println!("{}", res);
}
Результат выполнения кода:
42
Пример
Давайте поднимемся на два уровня вверх с помощью
super::super и обратимся к элементу
самого верхнего модуля:
mod level1
{
pub fn top()
{
println!("Top level");
}
pub mod level2
{
pub mod level3
{
pub fn call_top()
{
super::super::top();
}
}
}
}
fn main()
{
level1::level2::level3::call_top();
}
Результат выполнения кода:
"Top level"