الانتقال إلى المحتوى الرئيسي
الوحدة 5 · الدرس 2 من 210/14 في الدورة~15 min
دروس الوحدة (2/2)

السمات وحدود السمات

السمات تحدد السلوك الذي يمتلكه نوع معين ويمكن مشاركته مع الأنواع الأخرى. يمكننا استخدام السمات لتحديد مجموعة من الأساليب التي تمثل وظيفة أو واجهة مشتركة معينة، تشبه الواجهات في لغات البرمجة الأخرى.

حدود السمات تسمح لنا بتحديد أن النوع العام يجب أن ينفذ سمة معينة، مما يضمن توفر الأساليب المطلوبة في وقت الترجمة.


تحديد وتنفيذ سمة

لتحديد سمة، نستخدم الكلمة الأساسية trait متبوعة بتوقيعات الطرق التي يجب أن تحددها الأنواع المنفذة:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

لتنفيذ سمة على نوع ملموس، نستخدم الصيغة impl TraitName for TypeName:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

حدود السمات

عند كتابة وظائف عامة، يمكننا تقييد معلمات النوع للتأكد من أنها تنفذ سمة معينة. بناء الجملة القياسي هو <T: Trait>:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

وبدلاً من ذلك، بالنسبة للتوقيعات الأكثر تعقيدًا، يمكننا استخدام جملة where :

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

جربه بنفسك

التمرين 1: السمة الموجزة

تمرين#rust.m5.l2.e1
المحاولات: 0جارٍ التحميل…

حدد سمة تسمى ملخص تحتوي على توقيع الطريقة fn Summary(&self) -> String;. بعد ذلك، قم بتعريف بنية NewsArticle بحقل عنوان رئيسي من النوع String وقم بتنفيذ سمة الملخص لها بحيث تقوم طريقة التلخيص بإرجاع قيمة حقل العنوان.

جارٍ تحميل المحرر…
إظهار التلميح

حدد سمة "الملخص" وبنية "مقالة الأخبار". نفذ باستخدام `ملخص تضميني لـ NewsArticle` استنساخ الحقل`self.headline.clone()`.

الحل متاح بعد 3 من المحاولات

التمرين 2: حدود السمات باستخدام print_summary

تمرين#rust.m5.l2.e2
المحاولات: 0جارٍ التحميل…

استنادًا إلى التعليمات البرمجية الواردة في التمرين السابق، قم بتعريف وظيفة عامة تسمى print_summary<T> والتي تقبل عنصر معلمة من النوع &T. قم بتطبيق ربط السمة بحيث يجب على T تنفيذ سمة الملخص. داخل الدالة، اطبع النتيجة التي تم إرجاعها بواسطة item.summarize().

جارٍ تحميل المحرر…
إظهار التلميح

استخدم التوقيع `fn print_summary<T: Summary>(item: &T)` واستدعاء`item.summarize()`داخل`println!`.

الحل متاح بعد 3 من المحاولات

التمرين 3: حساب المساحة باستخدام السمات

تمرين#rust.m5.l2.e3
المحاولات: 0جارٍ التحميل…

حدد سمة تسمى "المنطقة" بالطريقة fn Area(&self) -> f64;. قم بإنشاء دائرة هيكلية تحتوي على حقل نصف قطر من النوع f64، وقم بتنفيذ سمة المنطقة لها عن طريق حساب المساحة (الصيغة: نصف القطر * نصف القطر * 3.14159).

جارٍ تحميل المحرر…
إظهار التلميح

حدد سمة المنطقة وبنية الدائرة. قم بتنفيذ`المنطقة(&الذات)` باستخدام صيغة منطقة الدائرة.

الحل متاح بعد 3 من المحاولات