#[derive(...)]
الاشتقاق التلقائي #[derive(...)]
#[derive(...)] يولّد تلقائيًا تنفيذ سمات قياسية شائعة (مثل Debug وClone) لهيكل أو تعداد، دون كتابة الكود يدويًا.
بعض السمات في المكتبة القياسية لها نمط تنفيذ ميكانيكي متكرّر (مقارنة كل الحقول، نسخ كل الحقول، طباعتها...). بدل كتابة impl يدويًا لكل سمة كهذه، يولّدها المترجم تلقائيًا عبر سمة الماكرو #[derive(...)] فوق تعريف الهيكل أو التعداد مباشرة.
شرط الاشتقاق أن تكون كل حقول النوع نفسها تنفّذ السمة المطلوبة — مثلًا لا يمكن اشتقاق Copy لهيكل يحوي String لأن String نفسها ليست Copy.
الصياغة
#[derive(Trait1, Trait2, ...)]
struct Name { ... }📄 مثال
#[derive(Debug, Clone, PartialEq)]
struct Point { x: i32, y: i32 }
let a = Point { x: 1, y: 2 };
let b = a.clone();
println!("{:?}", a); // طباعة تصحيحية بفضل Debug
println!("{}", a == b); // مقارنة بفضل PartialEqأهم النقاط
| العنصر | الوظيفة |
|---|---|
| Debug | يتيح الطباعة التصحيحية بـ {:?} |
| Clone | يتيح نسخ القيمة صراحة عبر .clone() |
| PartialEq | يتيح المقارنة بـ == و!= |
| Copy | يجعل النوع يُنسَخ ضمنيًا بدل النقل (فقط للأنواع البسيطة على المكدّس) |
💡 نصائح عملية
- أضِف #[derive(Debug)] بشكل شبه دائم لأي هيكل جديد أثناء التطوير — يسهّل التصحيح كثيرًا
- لا تشتق Copy إلا لأنواع بسيطة صغيرة (أعداد، حروف) — الأنواع التي تدير ذاكرة على الكومة مثل String لا تدعمها
⚠️ أخطاء شائعة
- محاولة اشتقاق Copy لهيكل يحوي حقلًا من نوع لا ينفّذها (مثل String أو Vec) — خطأ ترجمة
- نسيان أن Clone يجب استدعاؤها صراحة بـ .clone()، خلافًا لـ Copy التي تنسخ تلقائيًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار RUST الكامل بالعربي.