ما هي الـ Trait؟
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 29 من 61.
تسمح لك الـ Generics بكتابة كود يعمل مع أي نوع، ولكن في بعض الأحيان تحتاج إلى ضمان أن النوع يمكنه القيام بشيء محدد. وهنا يأتي دور الـ traits.
تُعرّف السمة (trait) مجموعة من الأساليب (methods) التي يجب على النوع (type) تنفيذها. فكر فيها كعقد—أي نوع "يوقع" هذا العقد يَعِدُ بتقديم السلوك المحدد. إذا كنت قد استخدمت الواجهات (interfaces) في لغات أخرى، فإن السمات (traits) تخدم غرضاً مماثلاً.
إليك كيفية تعريف trait:
trait Describable {
fn describe(&self) -> String;
}
تقدم الكلمة المفتاحية trait السمة (trait)، متبوعة باسمها. داخل الأقواس المتعرجة، تقوم بالتصريح عن تواقيع الدوال (method signatures)—فقط الاسم، والمعاملات، ونوع الإرجاع، بدون جسم للدالة. تشير الفاصلة المنقوطة بعد التوقيع إلى أن هذا متطلب، وليس تنفيذاً.
تقول سمة Describable هذه: "أي نوع يقوم بتنفيذ هذه السمة يجب أن يوفر طريقة describe تأخذ مرجعاً لنفسها وتعيد String." لا تهتم السمة بكيفية عمل الطريقة—هذا يعود لكل نوع يقوم بتنفيذها.
تصبح السمات (Traits) قوية عندما تقوم أنواع مختلفة متعددة بتنفيذ نفس السمة. يمكن أن يكون كل من Book و Car و Person جميعهم Describable، حيث يقدم كل منهم وصفه الفريد الخاص. تضمن السمة أنهم جميعاً يتشاركون هذه القدرة المشتركة.
التحدي
سهللنقم بتعريف أول سمة (trait) لك! تُنشئ السمة عقداً — وعداً بأن أي نوع يقوم بتنفيذها سيوفر سلوكاً معيناً. ستقوم بإنشاء سمة Summarizable يمكن للأنواع المختلفة تنفيذها لتقديم ملخص عن نفسها.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
summary.rs: قم بتعريف سمة عامة (public trait) تسمىSummarizableمع توقيع طريقة (method signature) واحدة:summarize(&self) -> String. تذكر، في تعريف السمة، تقوم فقط بالتصريح عن توقيع الطريقة باستخدام فاصلة منقوطة — بدون جسم (body). هذا يخبر Rust أن "any type that implements this trait must provide asummarizemethod that returns aString."main.rs: قم باستيراد وحدة summary الخاصة بك واطبع رسالة تؤكد تعريف السمة الخاصة بك. بما أننا لم نتعلم بعد كيفية تنفيذ السمات (هذا هو الدرس القادم!)، فستقوم ببساطة بالتحقق من أن السمة الخاصة بك يتم تجميعها (compiles) بشكل صحيح.
في ملفك الرئيسي، اطبع الرسالة التالية للتأكد من أن تعريف السمة الخاص بك صالح:
Summarizable trait defined successfully!يركز هذا التحدي بشكل بحت على بناء جملة تعريف السمة — الكلمة المفتاحية trait، واسم السمة، والتصريح عن توقيعات الطرق بدون تنفيذات. في الدرس القادم، ستتعلم كيفية جعل الهياكل (structs) تنفذ هذه السمة!
ورقة مرجعية
تُعرّف السمة (trait) مجموعة من الدوال (methods) التي يجب على النوع (type) تنفيذها. وهي تعمل كعقد يضمن أن النوع يوفر سلوكاً معيناً.
لتعريف سمة، استخدم الكلمة المفتاحية trait متبوعة باسم السمة وتواقيع الدوال (method signatures):
trait Describable {
fn describe(&self) -> String;
}
تشمل تواقيع الدوال في السمات الاسم، والمعاملات، ونوع الإرجاع، ولكن بدون جسم (body). تشير الفاصلة المنقوطة إلى أن هذا متطلب للأنواع التي تقوم بالتنفيذ.
يمكن لعدة أنواع مختلفة تنفيذ نفس السمة، حيث يوفر كل منها تنفيذه الخاص للدوال المطلوبة.
جرّب بنفسك
mod summary;
fn main() {
// مهام: اطبع رسالة التأكيد التي تفيد بأنه تم تعريف السمة (trait)
// المخرجات المتوقعة: "Summarizable trait defined successfully!"
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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 مع المعاملاتملخص - مشغل الوسائط