John Caruso
John Caruso

Reputation: 19

Module resolution

I have the following code in src/

main.rs
a.rs
b.rs

Here's the code:

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 ;
    }

b.rs

    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)
        }
    }

What I don't understand is how does "use crate::Summary;" not cause a problem in b.rs? It should be "use crate::a::Summary;" or even "use super::a::Summary;", but for some reason use crate::Summary works. Is there some kind of funky search logic being applied here under the hood?

Upvotes: 1

Views: 98

Answers (1)

Colonel Thirty Two
Colonel Thirty Two

Reputation: 26609

Items defined without a visibility specifier are available to the module that they're defined in and all of its sub-modules.

Since a and b are submodules of the crate root module, they can access the Summary object that was imported via a use declaration in main into the crate root module.

Upvotes: 2

Related Questions