Разрешение модуля

У меня есть следующий код в 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в корневой модуль ящика.

Другие вопросы по тегам