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

سمة Debug

جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 35 من 61.

تأتي مكتبة Rust القياسية مع العديد من السمات (traits) المحددة مسبقًا والتي توفر وظائف مشتركة. واحدة من أكثرها فائدة للتطوير هي سمة Debug، والتي تتيح لك طباعة محتويات الهيكل (struct) للفحص.

إذا حاولت طباعة هيكل (struct) مخصص مباشرةً، فلن يعرف Rust كيفية عرضه:

struct Player {
    name: String,
    score: u32,
}

let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p);  // خطأ! Debug غير مطبق

يتطلب المنسق {:?} السمة Debug. وبدلاً من تنفيذها يدوياً، توفر Rust اختصاراً—وهو السمة #[derive]. ضعها مباشرة فوق تعريف الـ struct الخاص بك:

#[derive(Debug)]
struct Player {
    name: String,
    score: u32,
}

let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p);  // Player { name: "Alice", score: 100 }

تخبر السمة #[derive(Debug)] المترجم بإنشاء تطبيق Debug تلقائيًا. يعمل هذا طالما أن جميع الحقول في الـ struct الخاص بك تقوم أيضًا بتطبيق Debug (وهو ما تفعله معظم الأنواع القياسية).

للحصول على مخرجات أكثر قابلية للقراءة مع الهياكل المتداخلة، استخدم {:#?} للطباعة الجميلة (pretty-printing):

println!("{:#?}", p);
// Player {
//     name: "Alice",
//     score: 100,
// }

يُعد اشتقاق Debug أمراً أساسياً أثناء التطوير، فهو يتيح لك فحص بياناتك بسرعة دون كتابة كود تنسيق مخصص.

challenge icon

التحدي

سهل

لنقم بجعل الـ structs الخاصة بك قابلة للفحص عن طريق اشتقاق سمة Debug! ستقوم بإنشاء نظام مخزون بسيط حيث يمكن طباعة العناصر لأغراض تصحيح الأخطاء.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • inventory.rs: قم بتعريف Item struct عام مع حقلين عامين: name (String) و quantity (u32). استخدم سمة #[derive(Debug)] لتنفيذ سمة Debug تلقائيًا للـ struct الخاص بك.
  • main.rs: قم باستيراد وحدة inventory الخاصة بك وأنشئ مثيل Item باستخدام المدخلات المقدمة. اطبع العنصر باستخدام منسق تصحيح الأخطاء {:?} لعرض هيكله الداخلي.

الجمال في اشتقاق Debug هو أن Rust يقوم تلقائيًا بإنشاء كود التنسيق لك — لا حاجة للتنفيذ اليدوي! يحتاج الـ struct الخاص بك فقط إلى السمة، ويصبح قابلاً للطباعة باستخدام {:?}.

يجب أن يعرض مخرجك العنصر بتنسيق تصحيح الأخطاء الخاص بـ Rust:

Item { name: "{name}", quantity: {quantity} }

على سبيل المثال، مع المدخلات Keyboard و 15:

Item { name: "Keyboard", quantity: 15 }

ستتلقى مدخلين: اسم العنصر والكمية (قم بتحليلها كـ u32).

جرّب بنفسك

mod inventory;

use inventory::Item;

fn main() {
    // قراءة المدخلات
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut quantity_str = String::new();
    std::io::stdin().read_line(&mut quantity_str).expect("Failed to read line");
    let quantity: u32 = quantity_str.trim().parse().expect("Failed to parse quantity");
    
    // TODO: إنشاء مثيل من Item بالاسم والكمية المعطيين
    
    // TODO: طباعة العنصر باستخدام منسق التصحيح {:?}
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming