impl
كتلة التنفيذ impl
impl تربط الدوال (methods) بهيكل أو تعداد معيّن، أو تنفّذ سمة (trait) عليه — هي مكان كتابة سلوك الأنواع.
Rust تفصل تعريف البيانات (struct/enum) عن سلوكها: البيانات تُعرَّف بـ struct أو enum، والدوال المرتبطة بها تُكتب داخل كتلة impl منفصلة. يمكن أن يكون لنوع واحد عدّة كتل impl، وتُستخدم impl أيضًا لتنفيذ سمة (trait) محدّدة على نوع ما.
الدالة الأولى بمعامل &self تصبح تابعًا (method) يُستدعى بنقطة (instance.method())، أما الدوال بلا self فتُستدعى عبر اسم النوع مباشرة (النوع::function()) وتُستخدم غالبًا كدوال إنشاء (constructors).
الصياغة
impl TypeName {
fn method(&self) -> T { ... }
fn new() -> Self { ... }
}
impl TraitName for TypeName { ... }📄 مثال
struct Circle { radius: f64 }
impl Circle {
fn new(radius: f64) -> Self {
Circle { radius }
}
fn area(&self) -> f64 {
3.14 * self.radius * self.radius
}
}
let c = Circle::new(2.0);
println!("{}", c.area());أهم النقاط
| العنصر | الوظيفة |
|---|---|
| fn method(&self) | تابع يقرأ الحالة دون تعديلها |
| fn method(&mut self) | تابع يعدّل حقول الكائن |
| fn new() -> Self | نمط شائع لدالة إنشاء لا تأخذ self |
| impl Trait for Type | تنفيذ سمة معيّنة على النوع |
💡 نصائح عملية
- اجعل الدالة تأخذ &self ما أمكن، ولا تستخدم self (بدون &) إلا إذا أردت نقل ملكية الكائن نفسه
- استخدم اسمًا اصطلاحيًا new لدالة الإنشاء — الاتفاق الشائع في مجتمع Rust
⚠️ أخطاء شائعة
- نسيان & قبل self فيتحوّل التابع لنقل ملكية الكائن كاملًا عند كل استدعاء
- محاولة استدعاء تابع &mut self على متغيّر غير معرّف بـ mut
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار RUST الكامل بالعربي.