Dela upp kod i moduler

Slutförd

Förutom att hjälpa dig att organisera din kod på ett bättre sätt 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 ser vi att modulen tillhandahåller authentication User struct-metoden med User::new metoden eftersom båda är offentliga. Lägg märke till pub nyckelordet .

Den här koden kan inte kompileras eftersom den försöker komma åt username password_hash fälten och från User structen, men de är privata. Om du kör koden resulterar det i 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 kontrollera vilka delar av programmet som kan komma åt varje del av en viss modul. Om vi vill ge läsåtkomst till fältet och skriva åtkomst till fältet samtidigt som de är privata kan vi använda username password get- och set-metoder:

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 authentication modulen.

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