0Pricing
Learn Rust Coding · درس

الأساليب الافتراضية

القيم الافتراضية للسمات

الأساليب الافتراضية درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

دوال ذات جسم

لا تقتصر دوال السمات على التواقيع فقط. يمكن للسمة توفير تنفيذ افتراضي — أي جسم دالة تحصل عليه الأنواع المنفذة تلقائيًا.

ويقلل ذلك الشيفرة المتكررة عبر أنواع عديدة.

دالة افتراضية

اكتب جسم التنفيذ داخل trait مباشرةً. ترثه الأنواع التي تطبّق trait تلقائيًا، من دون أي تعليمات برمجية إضافية.

trait Greet {
    fn hello(&self) -> String {
        String::from("Hello there")
    }
}

struct Robot;
impl Greet for Robot {}

fn main() {
    println!("{}", Robot.hello());
}

تجاوز التنفيذ الافتراضي

يمكن لأي نوع مُطبِّق تجاوز التنفيذ الافتراضي من خلال توفير نسخته الخاصة. ويستبدل التجاوزُ التنفيذَ الافتراضي لذلك النوع.

trait Greet {
    fn hello(&self) -> String { String::from("Hello there") }
}

struct Robot;
struct Pirate;
impl Greet for Robot {}
impl Greet for Pirate {
    fn hello(&self) -> String { String::from("Arr!") }
}

fn main() {
    println!("{}", Robot.hello());
    println!("{}", Pirate.hello());
}

استدعاء الأساليب المطلوبة من التنفيذات الافتراضية

يمكن لأسلوب افتراضي استدعاء أساليب أخرى في trait نفسه، حتى تلك التي لا تملك تنفيذًا افتراضيًا. وهذا نمط قوي: يوفّر النوع المُطبِّق نواة صغيرة، ثم تبني التنفيذات الافتراضية سلوكًا أكثر غنى فوقها.

trait Summary {
    fn title(&self) -> String;
    fn preview(&self) -> String {
        format!("Read more about: {}", self.title())
    }
}

struct Article { headline: String }
impl Summary for Article {
    fn title(&self) -> String { self.headline.clone() }
}

fn main() {
    let a = Article { headline: String::from("Rust Rocks") };
    println!("{}", a.preview());
}

نمط الأسلوب القالبي

يُسمّى هذا الجمع بين الأساليب المطلوبة والافتراضية نمطَ الأسلوب القالبي. يعرّف trait التدفق العام من خلال التنفيذات الافتراضية، ويترك الأجزاء المتغيرة كأساليب مطلوبة.

trait Report {
    fn body(&self) -> String;
    fn render(&self) -> String {
        format!("=== REPORT ===\n{}\n==============", self.body())
    }
}

struct Sales;
impl Report for Sales {
    fn body(&self) -> String { String::from("Sales up 10%") }
}

fn main() {
    println!("{}", Sales.render());
}

تنفيذات افتراضية متعددة

يمكن لـ trait أن يجمع بحرية بين الأساليب المطلوبة والافتراضية. ولا يحتاج النوع المُطبِّق إلا إلى توفير الأساليب المطلوبة.

trait Animal {
    fn name(&self) -> String;
    fn legs(&self) -> u32 { 4 }
    fn describe(&self) -> String {
        format!("{} has {} legs", self.name(), self.legs())
    }
}

struct Dog;
impl Animal for Dog {
    fn name(&self) -> String { String::from("Dog") }
}

fn main() {
    println!("{}", Dog.describe());
}

التنفيذات الافتراضية وtraits القياسية

تعتمد كثير من traits القياسية على التنفيذات الافتراضية. فعلى سبيل المثال، يتطلب Iterator الأسلوب next فقط؛ وكل محوِّل ومستهلك هو أسلوب افتراضي مبني عليه.

ولهذا يفتح أسلوب واحد المجال أمام مجموعة الأدوات بأكملها.

التجاوز من أجل الأداء

أحيانًا يعمل التنفيذ الافتراضي، لكن تكون نسخة متخصصة منه أسرع. ويمكن للأنواع المُطبِّقة تجاوز ذلك الأسلوب وحده مع الإبقاء على بقية التنفيذات الافتراضية.

trait Counter {
    fn items(&self) -> Vec<i32>;
    fn total(&self) -> i32 {
        self.items().iter().sum()
    }
}

struct Fast { precomputed: i32 }
impl Counter for Fast {
    fn items(&self) -> Vec<i32> { vec![] }
    fn total(&self) -> i32 { self.precomputed }
}

fn main() {
    println!("{}", Fast { precomputed: 99 }.total());
}

الحفاظ على سهولة استخدام traits

يتمثل التصميم الجيد لـ trait في جعل مجموعة صغيرة من الأساليب مطلوبة، وتوفير تنفيذات افتراضية مريحة لبقية الأساليب. وهكذا ينفذ النوع المُطبِّق أقل قدر من العمل، ويحصل في الوقت نفسه على واجهة غنية.

تنبيه

لا يمكن لأسلوب افتراضي استخدام إلا أساليب trait الأخرى، والوصول إلى النوع الموجود خلف self من خلالها؛ ولا يمكنه الوصول مباشرةً إلى حقول نوع مُطبِّق غير معروف. لذلك صمّم التنفيذات الافتراضية اعتمادًا على أساليب trait نفسه.

التنفيذات الافتراضية والمطلوبة باختصار

أسلوب trait الذي يحتوي على جسم تنفيذ هو افتراضي، أما الذي يحتوي على توقيع فقط فهو مطلوب. يجب على الأنواع المُطبِّقة توفير كل أسلوب مطلوب، لكن يمكنها ترك الأساليب الافتراضية من دون تغيير.

trait Logger {
    fn line(&self) -> String;
    fn log(&self) {
        println!("LOG: {}", self.line());
    }
}

struct App;
impl Logger for App {
    fn line(&self) -> String { String::from("started") }
}

fn main() {
    App.log();
}

تحقق سريع

اختبر مدى فهمك للأساليب الافتراضية.

مراجعة

لقد تعلمت التنفيذات الافتراضية في traits:

  • يمكن لأسلوب trait أن يتضمن جسم تنفيذ بوصفه تنفيذًا افتراضيًا
  • ترثه الأنواع المُطبِّقة تلقائيًا، ويمكنها تجاوزه
  • يمكن للتنفيذات الافتراضية استدعاء الأساليب المطلوبة، مما يتيح نمط الأسلوب القالبي
  • يحافظ ذلك على سهولة استخدام traits مع إبقاء مجموعة الأساليب المطلوبة صغيرة

الأسئلة الشائعة

هل درس «الأساليب الافتراضية» مجاني؟

نعم — نص درس «الأساليب الافتراضية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ماذا ستتعلم في «الأساليب الافتراضية»؟

القيم الافتراضية للسمات تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟

لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الأساليب الافتراضية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟

نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعريف السمات
  2. كائنات السمات وdyn
  3. الإرسال الساكن مقابل الديناميكي
  4. الأساليب الافتراضية
← العودة إلى Learn Rust Coding