Видимость в модуле в Rust
По умолчанию функция или тип видны только внутри того блока, где их объявили. Чтобы другой участок программы мог обратиться к имени, его открывают специальной пометкой перед объявлением.
Попробуем вызвать функцию без пометки из точки входа:
mod greet {
fn hello() -> String {
String::from("hi")
}
}
fn main() {
let text = greet::hello();
println!("{}", text);
}
Такой файл не собирается: точка входа
лежит снаружи блока greet, а
имя hello для нее закрыто.
Сообщение компилятора укажет, что функция
приватна для этого модуля.
Достаточно открыть имя наружу блока:
mod greet {
pub fn hello() -> String {
String::from("hi")
}
}
fn main() {
let text = greet::hello();
println!("{}", text);
}
Пометка pub делает имя доступным
снаружи модуля. Есть и более узкая запись
pub(crate): имя видно в любом
файле этого крейта, но не в чужом крейте,
который подключат как зависимость.
Дан следующий код:
mod data {
fn read() -> i32 {
7
}
}
fn main() {
let value = data::read();
println!("{}", value);
}
Исправьте объявление так, чтобы сборка прошла, не меняя точку входа.
Дан блок:
mod inner {
pub(crate) fn tag() -> &'static str {
"crate"
}
}
Скажите, сможет ли другой файл того же
крейта обратиться к inner::tag
и увидит ли имя соседний крейт из
зависимостей.
Дана функция внутри блока без пометки. Опишите, кто может к ней обратиться по полному пути, а кто нет.