Пути к имени в модуле в Rust
Полное имя функции или типа складывают из частей через два двоеточия. Так видно, в каком блоке живет значение и как к нему дойти из другого места файла или крейта.
Из любого файла крейта можно обратиться
к открытой функции, начиная путь со
слова crate:
mod greet {
pub fn hello() -> String {
String::from("hi")
}
}
mod app {
pub fn run() -> String {
crate::greet::hello()
}
}
fn main() {
let text = app::run();
println!("{}", text);
}
Запись crate::greet::hello читается
от корня текущего крейта: сначала блок
greet, затем функция hello.
Внутри вложенного блока часто пишут
super::, чтобы подняться на один
уровень к родителю.
Вложенный блок обращается к функции
родителя через super:::
mod greet {
pub fn hello() -> String {
String::from("hi")
}
mod inner {
pub fn call() -> String {
super::hello()
}
}
}
fn main() {
let text = greet::inner::call();
println!("{}", text);
}
Даны блоки:
mod base {
pub fn id() -> i32 {
1
}
}
mod wrap {
pub fn pick() -> i32 {
crate::base::id()
}
}
Допишите точку входа, которая выводит
результат wrap::pick.
Дан вложенный блок:
mod outer {
pub fn label() -> &'static str {
"out"
}
mod inner {
pub fn via_super() -> &'static str {
super::label()
}
}
}
Напишите, какой путь стоит внутри
via_super и зачем здесь нужен
родитель, а не crate::.
Дана точка входа с обращением
crate::math::twice. Опишите,
где в проекте должны лежать блок
math и функция twice.