Разрешение модуля
У меня есть следующий код в src/
main.rs
a.rs
b.rs
Вот код:
main.rs
mod a;
mod b;
use crate::a::Summary;
use crate::b::Person;
fn main() {
let p = Person{ first: "John".to_string(), last: "Doe".to_string() } ;
sum(p) ;
}
fn sum(summary: impl Summary) {
println!("{}", summary.summarize()) ;
}
a.rs
pub trait Summary {
fn summarize(&self) -> String ;
}
б.р.
use crate::Summary;
pub struct Person {
pub first: String,
pub last: String,
}
impl Summary for Person {
fn summarize(&self) -> String {
format!("{}, {}.", self.last, self.first)
}
}
Чего я не понимаю, так это того, как "use crate::Summary;" не вызывает проблемы в b.rs? Это должно быть «использовать crate::a::Summary;» или даже "использовать super::a::Summary;", но почему-то работает crate::Summary. Применяется ли здесь под капотом какая-то странная логика поиска?
1 ответ
Элементы, определенные без спецификатора видимости, доступны модулю, в котором они определены, и всем его подмодулям .
Сa
иb
являются подмодулями корневого модуля крейта, они могут получить доступ кSummary
объект, который был импортирован черезuse
декларация вmain
в корневой модуль ящика.