سمة 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 أمراً ضرورياً أثناء التطوير، فهو يتيح لك فحص بياناتك بسرعة دون الحاجة إلى كتابة كود تنسيق مخصص.
التحدي
سهلدعنا نجعل الـ structs الخاصة بك قابلة للفحص من خلال اشتقاق سمة Debug! ستقوم بإنشاء نظام مخزون بسيط حيث يمكن طباعة العناصر لأغراض تصحيح الأخطاء (debugging).
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
inventory.rs: قم بتعريف struct عام باسمItemمع حقلين عامين:name(String) وquantity(u32). استخدم سمة#[derive(Debug)]لتنفيذ سمة Debug تلقائيًا للـ struct الخاص بك.main.rs: قم باستيراد موديول inventory الخاص بك وأنشئ مثيلًا (instance) منItemباستخدام المدخلات المقدمة. اطبع العنصر باستخدام منسق التصحيح{:?}لعرض هيكله الداخلي.
جمال اشتقاق Debug هو أن Rust يولد كود التنسيق لك تلقائيًا — لا حاجة للتنفيذ اليدوي! يحتاج الـ struct الخاص بك فقط إلى السمة، ويصبح قابلًا للطباعة باستخدام {:?}.
يجب أن يعرض مخرجك العنصر بتنسيق debug الخاص بـ Rust:
Item { name: "{name}", quantity: {quantity} }على سبيل المثال، مع المدخلات Keyboard و 15:
Item { name: "Keyboard", quantity: 15 }ستتلقى مدخلين: اسم العنصر والكمية (قم بتحليلها كـ u32).
ورقة مرجعية
تسمح سمة Debug لك بطباعة محتويات الـ struct للمعاينة باستخدام المنسق {:?}.
استخدم السمة #[derive(Debug)] لتنفيذ Debug تلقائيًا للـ 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 }
للحصول على مخرجات منسقة بشكل أفضل (pretty-printed)، استخدم {:#?}:
println!("{:#?}", p);
// Player {
// name: "Alice",
// score: 100,
// }
تعمل السمة #[derive(Debug)] طالما أن جميع الحقول في الـ struct الخاص بك تنفذ أيضًا Debug، وهو ما تفعله معظم الأنواع القياسية.
جرّب بنفسك
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: إنشاء مثيل (instance) من Item بالاسم والكمية المعطاة
// TODO: طباعة العنصر باستخدام منسق التصحيح {:?}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائط