دروس الوحدة (2/2)
السمات وحدود السمات
السمات تحدد السلوك الذي يمتلكه نوع معين ويمكن مشاركته مع الأنواع الأخرى. يمكننا استخدام السمات لتحديد مجموعة من الأساليب التي تمثل وظيفة أو واجهة مشتركة معينة، تشبه الواجهات في لغات البرمجة الأخرى.
حدود السمات تسمح لنا بتحديد أن النوع العام يجب أن ينفذ سمة معينة، مما يضمن توفر الأساليب المطلوبة في وقت الترجمة.
تحديد وتنفيذ سمة
لتحديد سمة، نستخدم الكلمة الأساسية trait متبوعة بتوقيعات الطرق التي يجب أن تحددها الأنواع المنفذة:
pub trait Summary {
fn summarize(&self) -> String;
}لتنفيذ سمة على نوع ملموس، نستخدم الصيغة impl TraitName for TypeName:
pub struct NewsArticle {
pub headline: String,
pub content: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}", self.headline)
}
}حدود السمات
عند كتابة وظائف عامة، يمكننا تقييد معلمات النوع للتأكد من أنها تنفذ سمة معينة. بناء الجملة القياسي هو <T: Trait>:
pub fn notify<T: Summary>(item: &T) {
println!("Notification: {}", item.summarize());
}وبدلاً من ذلك، بالنسبة للتوقيعات الأكثر تعقيدًا، يمكننا استخدام جملة where :
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notification: {}", item.summarize());
}جربه بنفسك
التمرين 1: السمة الموجزة
حدد سمة تسمى ملخص تحتوي على توقيع الطريقة fn Summary(&self) -> String;. بعد ذلك، قم بتعريف بنية NewsArticle بحقل عنوان رئيسي من النوع String وقم بتنفيذ سمة الملخص لها بحيث تقوم طريقة التلخيص بإرجاع قيمة حقل العنوان.
إظهار التلميح
حدد سمة "الملخص" وبنية "مقالة الأخبار". نفذ باستخدام `ملخص تضميني لـ NewsArticle` استنساخ الحقل`self.headline.clone()`.
الحل متاح بعد 3 من المحاولات
التمرين 2: حدود السمات باستخدام print_summary
استنادًا إلى التعليمات البرمجية الواردة في التمرين السابق، قم بتعريف وظيفة عامة تسمى print_summary<T> والتي تقبل عنصر معلمة من النوع &T. قم بتطبيق ربط السمة بحيث يجب على T تنفيذ سمة الملخص. داخل الدالة، اطبع النتيجة التي تم إرجاعها بواسطة item.summarize().
إظهار التلميح
استخدم التوقيع `fn print_summary<T: Summary>(item: &T)` واستدعاء`item.summarize()`داخل`println!`.
الحل متاح بعد 3 من المحاولات
التمرين 3: حساب المساحة باستخدام السمات
حدد سمة تسمى "المنطقة" بالطريقة fn Area(&self) -> f64;. قم بإنشاء دائرة هيكلية تحتوي على حقل نصف قطر من النوع f64، وقم بتنفيذ سمة المنطقة لها عن طريق حساب المساحة (الصيغة: نصف القطر * نصف القطر * 3.14159).
إظهار التلميح
حدد سمة المنطقة وبنية الدائرة. قم بتنفيذ`المنطقة(&الذات)` باستخدام صيغة منطقة الدائرة.
الحل متاح بعد 3 من المحاولات