تنفيذ الـ Traits
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 30 من 61.
الآن بعد أن عرفت كيفية تعريف trait، لنرَ كيفية جعل struct يفي بهذا العقد. يؤدي تنفيذ trait إلى ربط المتطلب المجرّد بالسلوك الملموس.
تستخدم الصياغة impl TraitName for StructName:
trait Speak {
fn speak(&self) -> String;
}
struct Dog {
name: String,
}
impl Speak for Dog {
fn speak(&self) -> String {
format!("{} says: Woof!", self.name)
}
}
تُخبر كتلة impl Speak for Dog لغة Rust بأن Dog يطبّق السمة Speak. وداخلها، توفّر جسم الطريقة الفعلي. وهنا تحدّد كيفية تكلّم الكلب.
تتضح قوة السمات عندما تنفّذ أنواع متعددة السمة نفسها:
struct Cat {
name: String,
}
impl Speak for Cat {
fn speak(&self) -> String {
format!("{} says: Meow!", self.name)
}
}
يشترك كلٌّ من Dog وCat الآن في قدرة Speak، لكن كلًّا منهما يوفّر تطبيقًا فريدًا خاصًا به. يمكنك استدعاء .speak() على أيٍّ من النوعين:
let dog = Dog { name: String::from("Rex") };
let cat = Cat { name: String::from("Whiskers") };
println!("{}", dog.speak()); // Rex يقول: Woof!
println!("{}", cat.speak()); // Whiskers يقول: Meow!
هذا هو أساس تعدد الأشكال في Rust: أنواع مختلفة، وواجهة واحدة، وسلوكيات فريدة.
التحدي
سهللنضفِ الحيوية على السمات من خلال تنفيذها لأنواع مختلفة! ستنشئ سمة Describable وتنفذها لبنيتين مختلفتين، بحيث توفر كل منهما وصفًا فريدًا خاصًا بها.
ستنظم التعليمات البرمجية عبر ثلاثة ملفات:
describable.rs: عرّف سمة عامةDescribableباستخدام أسلوبdescribe(&self) -> String.items.rs: أنشئ بنيتين عامتين تنفذان سمتك:Bookمع حقل عامtitle(String)Movieمع حقل عامname(String)
Describableباستخدام تنسيق وصف فريد خاص بها.main.rs: اجمع وحداتك معًا، وأنشئ نسخًا من كلتا البنيتين، واستدعِ أساليبdescribeالخاصة بهما لإظهار كيف تنتج السمة نفسها مخرجات مختلفة للأنواع المختلفة.
يجب أن تصف Book نفسها على أنها Book: {title}، وأن تصف Movie نفسها على أنها Film: {name}. لاحظ كيف يفي كل نوع بالعقد نفسه، ولكن بسلوكه الخاص!
في ملفك الرئيسي، أنشئ كتابًا وفيلمًا باستخدام المدخلين المتوفرين، ثم اطبع وصفيهما في سطرين منفصلين.
يجب أن تتبع مخرجاتك هذا التنسيق:
Book: {title}
Film: {name}على سبيل المثال، مع المدخلين 1984 وInception:
Book: 1984
Film: Inceptionستتلقى مدخلين: عنوان كتاب واسم فيلم.
REQUIRED OUTPUT FORMAT:جرّب بنفسك
mod describable;
mod items;
use describable::Describable;
use items::{Book, Movie};
fn main() {
// اقرأ المدخلات
let mut title = String::new();
std::io::stdin().read_line(&mut title).expect("Failed to read line");
let title = title.trim().to_string();
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// TODO: أنشئ مثيل Book باستخدام title
// TODO: أنشئ مثيل Movie باستخدام name
// TODO: اطبع وصف الكتاب
// TODO: اطبع وصف الفيلم
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت