تخطَّ إلى المحتوى

#[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 الكامل بالعربي.