Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الأساليب القابلة للتعديل

جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 3 من 61.

أحيانًا تحتاج methods إلى القيام بأكثر من مجرد قراءة البيانات. فهي تحتاج إلى تغييرها. لإنشاء methods يمكنها تعديل حقول struct، نستخدم &mut self بدلًا من &self.

تشير الكلمة المفتاحية mut إلى استعارة قابلة للتغيير، مما يمنح الطريقة الإذن بتعديل الحالة الداخلية للمثيل:

struct Counter {
    value: i32,
}

impl Counter {
    fn increment(&mut self) {
        self.value += 1;
    }
    
    fn decrement(&mut self) {
        self.value -= 1;
    }
    
    fn get(&self) -> i32 {
        self.value
    }
}

لاحظ أن increment وdecrement يستخدمان &mut self لأنهما يعدّلان value، بينما تستخدم get &self لأنها تقرأ البيانات فقط.

عند استدعاء الأساليب القابلة للتغيير، يجب التصريح عن المثيل نفسه على أنه قابل للتغيير:

fn main() {
    let mut counter = Counter { value: 0 };
    
    counter.increment();
    counter.increment();
    println!("{}", counter.get()); // 2
    
    counter.decrement();
    println!("{}", counter.get()); // 1
}

إذا نسيت الكلمة المفتاحية mut عند إنشاء instance، فستمنعك Rust من استدعاء أي &mut self methods عليها. يضمن لك ذلك أن تكون دائمًا على دراية بالوقت الذي قد تتغير فيه بياناتك.

challenge icon

التحدي

سهل

أنشئ بنية BankAccount بحقل واحد: balance (i32).

أضف كتلة implementation لـ BankAccount مع ثلاث methods:

  • deposit: تأخذ &mut self وamount: i32، وتضيف amount إلى balance
  • withdraw: تأخذ &mut self وamount: i32، وتطرح amount من balance
  • get_balance: تأخذ &self وتُرجع balance الحالي كنوع i32

ستتلقى ثلاثة إدخالات:

  • السطر الأول: الرصيد initial (i32)
  • السطر الثاني: مبلغ الإيداع (i32)
  • السطر الثالث: مبلغ السحب (i32)

أنشئ كائنًا mutable من BankAccount باستخدام الرصيد initial، ثم أجرِ deposit للمبلغ المعطى، وwithdraw للمبلغ المعطى، واطبع الرصيد final.

تنسيق الناتج المتوقع:

{final_balance}

جرّب بنفسك

use std::io;

// TODO: عرّف الـ struct الخاص بـ BankAccount هنا


// TODO: أضف كتلة التنفيذ لـ BankAccount مع الدوال deposit و withdraw و get_balance


fn main() {
    let mut input = String::new();
    
    // اقرأ الرصيد الابتدائي
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let initial_balance: i32 = input.trim().parse().expect("Invalid number");
    
    input.clear();
    
    // اقرأ مبلغ الإيداع
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
    
    input.clear();
    
    // اقرأ مبلغ السحب
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
    
    // TODO: أنشئ نسخة mutable من BankAccount مع initial_balance
    // TODO: استدعِ deposit مع deposit_amount
    // TODO: استدعِ withdraw مع withdraw_amount
    // TODO: اطبع الرصيد النهائي باستخدام get_balance
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت