Separare i moduli in file diversi

Completato

Quando il contenuto del modulo è eccessivo, l'esplorazione del codice diventa più complessa. Provare a spostare il contenuto del modulo in un file separato.

Si sposterà ora il codice dell'esempio precedente nel file denominato src/authentication.rs e quindi si cambierà il file radice del crate.

Nome file: src/main.rs

mod authentication;

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

    println!("The username is: {}", user.get_username());
    user.set_password("even-more-secret");
}

Nome file: src/authentication.rs

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.to_owned()),
        }
    }

    pub fn get_username(&self) -> &String {
        &self.username
    }

    pub fn set_password(&mut self, new_password: &str) {
        self.password_hash = hash_password(&new_password.to_owned())
    }
}

fn hash_password<T: Hash>(t: &T) -> u64 {/* ... */}

Inserire un punto e virgola dopo mod authentication invece di un blocco di codice. Con l'aumentare delle dimensioni dei file, questa tecnica consente di spostare automaticamente i moduli in nuovi file. Il compilatore carica il contenuto del modulo da un altro file il cui nome è uguale a quello del modulo.

Quando il contenuto viene caricato, l'albero dei moduli rimane invariato. Il codice funzionerà comunque senza richiedere modifiche, anche se le definizioni sono presenti in file diversi.