فصل الوحدات النمطية إلى ملفات مختلفة

مكتمل

عندما تصبح محتويات الوحدة كبيرة للغاية، يصبح التنقل عبر التعليمات البرمجية أكثر صعوبة. فكِّر في نقل محتويات الوحدة إلى ملف منفصل.

لننقل التعليمات البرمجية من مثالنا السابق إلى ملفها الخاص المسمى src/authentication.rs ثم نغير ملف جذر الصندوق.

Filename: 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");
}

Filename: 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 {/* ... */}

ضع فاصلة منقوطة بعد mod authentication بدلاً من كتلة تعليمات برمجية. تمكّنك هذه الطريقة من نقل الوحدات تلقائيًا إلى ملفات جديدة عندما يزداد حجمها. يقوم المحول البرمجي بتحميل محتويات الوحدة من ملف آخر له نفس اسم الوحدة.

عند تحميل المحتوى، تظل شجرة الوحدة كما هي. ستعمل التعليمات البرمجية أيضًا بدون الحاجة إلى أي تغييرات، على الرغم من وجود التعريفات في ملفات مختلفة.