الأساليب القابلة للتعديل
جزء من قسم البرمجة كائنية التوجه في رحلة 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 عليها. يضمن لك ذلك أن تكون دائمًا على دراية بالوقت الذي قد تتغير فيه بياناتك.
التحدي
سهلأنشئ بنية BankAccount بحقل واحد: balance (i32).
أضف كتلة implementation لـ BankAccount مع ثلاث methods:
deposit: تأخذ&mut selfوamount: i32، وتضيف amount إلى balancewithdraw: تأخذ&mut selfوamount: i32، وتطرح amount من balanceget_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
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت