Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تنفيذ الـ 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: أنواع مختلفة، وواجهة واحدة، وسلوكيات فريدة.

challenge icon

التحدي

سهل

لنضفِ الحيوية على السمات من خلال تنفيذها لأنواع مختلفة! ستنشئ سمة 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: [Your translated content here]

جرّب بنفسك

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: اطبع وصف الفيلم
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت