Dela upp kod i moduler
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.