0Pricing
Learn Rust Coding · درس

الإرسال الساكن مقابل الديناميكي

الموازنة بين الخيارات

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

طريقتان للتوزيع

عند استدعاء دالة سمة، يجب على Rust تحديد التنفيذ الفعلي الذي سيعمل. وهناك استراتيجيتان: التوزيع الثابت (يُحسم أثناء الترجمة) والتوزيع الديناميكي (يُحسم أثناء التشغيل).

التوزيع الثابت باستخدام الأنواع العامة

تستخدم الدوال العامة التوزيع الثابت. وينشئ المترجم نسخة متخصصة لكل نوع فعلي — وهي عملية تُسمى التخصيص الأحادي.

trait Area { fn area(&self) -> f64; }
struct Square { s: f64 }
impl Area for Square { fn area(&self) -> f64 { self.s * self.s } }

fn print_area<T: Area>(shape: &T) {
    println!("{}", shape.area());
}

fn main() {
    print_area(&Square { s: 4.0 });
}

التخصيص الأحادي

ينشئ المترجم نسخة مخصصة من الدالة لكل نوع تستدعيها معه. ويصبح استدعاء الدالة استدعاءً مباشرًا دون بحث، ولذلك يكون سريعًا بقدر الشيفرة المكتوبة يدويًا.

التوزيع الديناميكي باستخدام dyn

تستخدم كائنات السمات التوزيع الديناميكي. وتتولى دالة واحدة جميع الأنواع؛ ويُعثر على عنوان الدالة أثناء التشغيل عبر جدول الدوال الافتراضية.

trait Area { fn area(&self) -> f64; }
struct Square { s: f64 }
impl Area for Square { fn area(&self) -> f64 { self.s * self.s } }

fn print_area(shape: &dyn Area) {
    println!("{}", shape.area());
}

fn main() {
    print_area(&Square { s: 4.0 });
}

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

كائن السمة هو مؤشر عريض: يشير أحد جزأيه إلى البيانات، ويشير الجزء الآخر إلى جدول الدوال الافتراضية الذي يسرد عناوين الدوال. ويستخدم كل استدعاء فهرسًا في هذا الجدول.

وهذا المستوى الإضافي من indirection هو كلفة التشغيل.

المفاضلة في السرعة

يكون التوزيع الثابت أسرع في كل استدعاء، ويمكن تضمينه، لكنه يولد شيفرة آلة أكبر. أما التوزيع الديناميكي فيضيف مستوى indirection صغيرًا، لكنه يحافظ على صغر حجم الشيفرة.

في معظم التطبيقات يكون الفرق ضئيلًا؛ لذا اختر بناءً على المرونة.

المفاضلة في حجم الشيفرة

يؤدي استدعاء دالة عامة مع أنواع كثيرة إلى إنشاء نسخ عديدة، مما قد يزيد حجم الملف الثنائي. وتتجنب دالة واحدة تستخدم dyn هذا التكرار.

ولهذا تفضّل المكتبات أحيانًا استخدام كائنات السمات داخليًا.

المفاضلة في المرونة

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

trait Area { fn area(&self) -> f64; }
struct Square { s: f64 }
struct Rect { w: f64, h: f64 }
impl Area for Square { fn area(&self) -> f64 { self.s * self.s } }
impl Area for Rect { fn area(&self) -> f64 { self.w * self.h } }

fn main() {
    let shapes: Vec<Box<dyn Area>> = vec![Box::new(Square { s: 2.0 }), Box::new(Rect { w: 3.0, h: 4.0 })];
    let total: f64 = shapes.iter().map(|s| s.area()).sum();
    println!("{}", total);
}

استخدام الطريقتين معًا

يمكنك الجمع بينهما: فقد تقبل دالة عامة impl Trait عند الحد الفاصل، وتخزّن القيم داخليًا كـ Box<dyn Trait>. استخدم كل طريقة حيث تناسب.

دليل اتخاذ القرار

قواعد سريعة:

  • نوع واحد لكل استدعاء، ومسار كثير الاستخدام؟ استخدم الأنواع العامة (التوزيع الثابت).
  • أنواع مختلطة في مجموعة؟ استخدم dyn (التوزيع الديناميكي).
  • هل تقلق بشأن حجم الملف الثنائي؟ اتجه إلى dyn.

كلتاهما بلا كلفة حيث يهم الأمر

لا تضيف Rust أي تكلفة لم تطلبها. لا تفرض الأنواع العامة أي تكلفة أثناء التشغيل؛ ولا تفرض كائنات السمات سوى مستوى indirection واحدًا للمؤشر. وأنت تختار المفاضلة صراحةً.

تحقق سريع

اختبر معرفتك بالتوزيع.

مراجعة

لقد قارنت بين أسلوبي التوزيع:

  • الثابت (الأنواع العامة): مخصص أحاديًا، سريع، ملف ثنائي أكبر، نوع واحد لكل استدعاء
  • الديناميكي (dyn): بحث في جدول الدوال الافتراضية، مرن، شيفرة أصغر، ويسمح بمجموعات مختلطة
  • اختر بناءً على احتياجات المرونة والأداء وحجم الملف الثنائي

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

هل درس «الإرسال الساكن مقابل الديناميكي» مجاني؟

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

ماذا ستتعلم في «الإرسال الساكن مقابل الديناميكي»؟

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

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

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

كم من الوقت يستغرق درس «الإرسال الساكن مقابل الديناميكي»؟

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

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

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

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

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