ما هي الـ Trait؟
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 29 من 61.
تتيح لك الأنواع العامة كتابة تعليمات برمجية تعمل مع أي نوع، لكنك تحتاج أحيانًا إلى ضمان قدرة نوع ما على تنفيذ شيء محدد. وهنا يأتي دور trait.
يُعرِّف trait مجموعةً من الأساليب التي يجب على النوع تنفيذها. فكّر فيه على أنه عقد: أي نوع «يوقّع» هذا العقد يتعهّد بتوفير السلوك المحدّد. إذا كنت قد استخدمت الواجهات في لغات أخرى، فإن traits تؤدي غرضًا مشابهًا.
إليك كيفية تعريف trait:
trait Describable {
fn describe(&self) -> String;
}
تقدّم الكلمة المفتاحية trait الـtrait، متبوعةً باسمها. داخل الأقواس المعقوفة، تعلن عن تواقيع method، أي الاسم والمعلمات ونوع القيمة المُرجعة فقط، من دون body. تشير الفاصلة المنقوطة semicolon بعد التوقيع إلى أن هذا متطلب وليس تطبيقًا.
يقول هذا Describable trait: "يجب على أي نوع يطبّقني أن يوفّر describe method يأخذ مرجعًا إلى نفسه ويعيد String." لا يهتم trait بكيفية عمل method: فهذا متروك لكل نوع يطبّقه.
تصبح السمات قوية عندما تنفّذ أنواع مختلفة متعددة السمة نفسها. يمكن أن يكون كلٌّ من Book وCar وPerson من النوع Describable، بحيث يوفّر كلٌّ منها وصفه الفريد. تضمن السمة أنها جميعًا تشترك في هذه القدرة المشتركة.
التحدي
سهللنعرّف أول trait لك! يحدّد trait عقدًا: وعدًا بأن أي نوع يطبّقه سيوفّر سلوكًا محددًا. ستنشئ trait باسم Summarizable يمكن لأنواع مختلفة تطبيقه لتوفير ملخّص عن نفسها.
ستنظّم الشيفرة الخاصة بك عبر ملفين:
summary.rs: Define trait عامًا public يسمىSummarizableمع method signature واحدة:summarize(&self) -> String. Remember، في definition الخاص بـ trait، أنت declare فقط method signature مع semicolon: من دون body. يخبر هذا Rust بأن «أي نوع يطبّق هذا trait يجب أن يوفّر method باسمsummarizeتُعيد قيمة من نوعString».main.rs: أدرِج وحدة summary واطبع message يؤكد أن trait الخاص بك قد تم تعريفه. بما أننا لم نتعلّم بعد كيفية تطبيق traits (فهذا هو الدرس التالي!)، ستتحقق ببساطة من أن trait الخاص بك يُترجم بنجاح.
في ملف main الخاص بك، اطبع message التالي للتأكد من أن definition الخاص بـ trait صالح:
Summarizable trait defined successfully!يركّز هذا التحدي فقط على صياغة definition الخاصة بـ trait: الكلمة المفتاحية trait، واسم trait، وdeclare لـ method signatures من دون implementations. في الدرس التالي، ستتعلّم كيفية جعل البُنى تطبّق هذا trait!
جرّب بنفسك
mod summary;
fn main() {
// TODO: اطبع رسالة التأكيد بأن الـ trait معرّف
// Expected output: "Summarizable trait defined successfully!"
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت