الـ Structs القابلة للتعديل
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 23 من 66.
بشكل افتراضي، تكون مثيلات الـ struct في لغة Rust غير قابلة للتغيير - فبمجرد إنشائها، لا يمكنك تغيير قيم حقولها. ومع ذلك، تماماً كما هو الحال مع المتغيرات الأخرى، يمكنك جعل مثيل الـ struct قابلاً للتغيير عن طريق إضافة الكلمة المفتاحية mut عند التصريح عنه.
عندما تعلن عن مثيل لبنية (struct) كقابل للتغيير (mutable)، يمكنك تعديل أي من حقوله باستخدام تدوين النقطة (dot notation):
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // هذا يعمل لأن player قابل للتغييربدون الكلمة المفتاحية mut، ستؤدي محاولة تغيير حقل إلى خطأ في التجميع. تنطبق القابلية للتغيير على مثيل الـ struct بالكامل - لا يمكنك جعل حقول فردية قابلة للتغيير مع إبقاء الحقول الأخرى غير قابلة للتغيير.
التحدي
سهلستتلقى أربعة مدخلات: اسم اللاعب، والدرجة الأولية (كعدد صحيح)، ودرجة إضافية (bonus) لإضافتها (كعدد صحيح)، وتعديل نهائي للدرجة (كعدد صحيح). قم بتعريف هيكل Player يحتوي على حقلين: name من نوع String و score من نوع i32. أنشئ نسخة قابلة للتعديل (mutable) من هذا الهيكل، ثم قم بتعديل حقل الدرجة عدة مرات باستخدام قيم المدخلات.
المتطلبات:
- قم بتعريف هيكل
Playerمع الحقول:name: Stringوscore: i32 - اقرأ المدخل الأول كاسم للاعب
- اقرأ المدخل الثاني وقم بتحويله إلى
i32للدرجة الأولية - أنشئ نسخة mutable من هيكل
Playerبهذه القيم - اقرأ المدخل الثالث وقم بتحويله إلى
i32للدرجة الإضافية - أضف الدرجة الإضافية إلى درجة اللاعب الحالية باستخدام تدوين النقطة (dot notation)
- اقرأ المدخل الرابع وقم بتحويله إلى
i32للتعديل النهائي - أضف التعديل النهائي إلى درجة اللاعب الحالية
- اطبع معلومات اللاعب بالتنسيق الدقيق الموضح أدناه
المدخلات:
- السطر الأول: اسم اللاعب (مثلاً،
Alice) - السطر الثاني: الدرجة الأولية كعدد صحيح (مثلاً،
50) - السطر الثالث: الدرجة الإضافية كعدد صحيح (مثلاً،
30) - السطر الرابع: التعديل النهائي كعدد صحيح (مثلاً،
20)
المخرجات:
- السطر الأول:
Player: [name] - السطر الثاني:
Final Score: [score]
ورقة مرجعية
تكون مثيلات الـ Struct في لغة Rust غير قابلة للتغيير (immutable) افتراضيًا. لتعديل قيم الحقول بعد الإنشاء، قم بالتصريح عن المثيل كقابل للتغيير (mutable) باستخدام الكلمة المفتاحية mut:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // تعديل الحقل باستخدام تدوين النقطة (dot notation)تنطبق قابلية التغيير (Mutability) على مثيل الـ struct بالكامل - لا يمكنك جعل حقول فردية قابلة للتغيير مع إبقاء الحقول الأخرى غير قابلة للتغيير.
جرّب بنفسك
use std::io;
// TODO: قم بتعريف هيكل Player هنا مع حقول الاسم (name) والنتيجة (score)
fn main() {
// قراءة اسم اللاعب
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// قراءة النتيجة الأولية
let mut initial_score = String::new();
io::stdin().read_line(&mut initial_score).expect("Failed to read line");
let initial_score: i32 = initial_score.trim().parse().expect("Invalid number");
// قراءة نتيجة المكافأة
let mut bonus = String::new();
io::stdin().read_line(&mut bonus).expect("Failed to read line");
let bonus: i32 = bonus.trim().parse().expect("Invalid number");
// قراءة التعديل النهائي
let mut adjustment = String::new();
io::stdin().read_line(&mut adjustment).expect("Failed to read line");
let adjustment: i32 = adjustment.trim().parse().expect("Invalid number");
// TODO: قم بإنشاء مثيل قابل للتعديل من Player
// TODO: أضف نتيجة المكافأة إلى نتيجة اللاعب
// TODO: أضف التعديل النهائي إلى نتيجة اللاعب
// TODO: اطبع المخرجات بالتنسيق المطلوب
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
تعبير 'match'مطابقة قيم متعددةمطابقة النطاقاتتعبير 'if let'الحلقات التكرارية كتعبيراتمراجعة - محلل أوامر بسيط4تجميع البيانات باستخدام Structs
ما هو الـ Struct؟نظرة عامة على الـ Structsالوصول إلى حقول الـ Structالـ Structs القابلة للتعديلالـ Structs كمعاملات للدوالالـ Tuple Structsمراجعة - إنشاء Book Struct7معالجة الأخطاء باستخدام 'Result'
ما هو 'Result'؟استخدام 'match' مع 'Result'is_ok() و is_err()اختصارات: unwrap و expectعامل علامة الاستفهام '?'تحويل السلاسل النصية إلى أرقامملخص - دالة القسمة الآمنة10الـ Closures والدوال المجهولة
ما هو الـ Closure؟تعريف Closure بسيطالـ Closures مع المعاملاتالتقاط البيئة المحيطةملخص - Closure الجامع البسيط2مقدمة في الـ Vectors
ما هو الـ Vector؟إنشاء Vectorإضافة عناصر باستخدام pushالوصول إلى عناصر الـ Vectorالتكرار عبر الـ Vectorالتكرار القابل للتعديل (Mutable Iteration)إزالة العناصرمراجعة - متتبع نقاط بسيط5أزواج (المفتاح والقيمة) مع Hash Maps
ما هو Hash Map؟إنشاء Hash Mapإدراج أزواج (المفتاح والقيمة)الوصول إلى القيمالتكرار عبر Hash Mapتحديث قيمةإزالة زوجملخص - عداد الكلمات6التعامل مع غياب القيم باستخدام 'Option'
ما هو الـ 'Option'؟استخدام 'match' مع 'Option''is_some()' و 'is_none()'فك تغليف الـ 'Option'الدالة 'expect'توفير قيمة افتراضية: 'unwrap_or'مراجعة - البحث عن عنصر9شرائح الـ String والمزيد
String مقابل &strإنشاء شرائح الـ Stringالشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى