Dela upp kod i moduler

Slutförd

Förutom att hjälpa dig att bättre organisera din kod ger moduler även sekretessgarantier för dina värden, typer och metoder.

Ta en titt på det här exemplet, där vi modellerar ett förenklat autentiserings-API:

mod authentication {
    pub struct User {
        username: String,
        password_hash: u64,
    }

    impl User {
        pub fn new(username: &str, password: &str) -> User {
            User {
                username: username.to_string(),
                password_hash: hash_password(password),
            }
        }    
    }
    fn hash_password(input: &str) -> u64 { /*...*/ }
}

fn main() {

    let user = authentication::User::new("jeremy", "super-secret");

    println!("The username is: {}", user.username);
    println!("The password is: {}", user.password_hash);

}

I föregående kod kan vi se att modulen authentication tillhandahåller User metoden struct User::new eftersom båda är offentliga. Lägg märke till nyckelordet pub .

Den här koden kan inte kompileras eftersom den försöker komma åt fälten username och password_hash från structen User , men de är privata. Om du kör koden uppstår följande fel:

    error[E0616]: field `username` of struct `User` is private
      --> src/main.rs:28:42
       |
    28 |     println!("The username is: {}", user.username);
       |                                          ^^^^^^^^ private field

    error[E0616]: field `password_hash` of struct `User` is private
      --> src/main.rs:29:42
       |
    29 |     println!("The password is: {}", user.password_hash);
       |                                          ^^^^^^^^^^^^^ private field

    error: aborting due to 2 previous errors

Den här felinformationen är användbar när vi vill styra vilka delar av programmet som kan komma åt varje del av en viss modul. Om vi vill ge läsåtkomst till username fältet och skriva åtkomst till password fältet samtidigt som de hålls privata kan vi använda metoder för getter och setter:

mod authentication {

    // ...

    impl User {

    // ...

        pub fn get_username(&self) -> &String {
            &self.username
        }
    
        pub fn set_password(&mut self, new_password: &str) {
            self.password_hash = hash_password(new_password)
        }
    }
}

Nu styrs varje läs- och skrivförsök av modulen authentication .

Om du vill visa koden för den här lektionen går du till den här Länken för Rust Playground.