الانتقال إلى المحتوى الرئيسي
الوحدة 5 · الدرس 1 من 29/14 في الدورة~12 min
دروس الوحدة (1/2)

الأدوية العامة والوظائف

الأدوية العامة تسمح لك بكتابة تعليمات برمجية مرنة وقابلة لإعادة الاستخدام، وتجنب تكرار المنطق لأنواع البيانات المختلفة. بدلاً من تحديد وظائف أو بنيات متعددة لأنواع مختلفة (مثل i32، أو f64، أو String)، يمكننا استخدام معلمة نوع عامة، يتم تمثيلها تقليديًا بالحرف T.

يقوم مترجم Rust بإدارة الأدوية العامة باستخدام عملية تسمى monomorphization: أثناء التجميع، يقوم بإنشاء نسخة من الكود العام لكل نوع ملموس يتم استخدامه بالفعل. وهذا يعني أنه لا يوجد أي حمل إضافي لأداء وقت التشغيل.


وظائف عامة

لتعريف دالة عامة، نقوم بإدخال معلمة النوع <T> مباشرةً بعد اسم الوظيفة وقبل قائمة الوسائط:

Rust
fn print_value<T: std::fmt::Debug>(value: T) {
    println!("Value: {:?}", value);
}

في الدوال العامة، يمكننا استخدام النوع العام T لكل من أنواع الوسائط وأنواع الإرجاع:

Rust
fn identity<T>(value: T) -> T {
    value
}

الهياكل العامة

يمكننا أيضًا استخدام معلمات النوع العامة داخل الهياكل (struct) لتحديد الحقول المرنة:

Rust
struct KeyValuePair<K, V> {
    key: K,
    value: V,
}

fn main() {
    let pair = KeyValuePair {
        key: String::from("age"),
        value: 30,
    };
}

في كتلة impl لبنية عامة، يجب أن نعلن عن معلمة النوع <T> مباشرةً بعد الكلمة الأساسية impl للإشارة إلى أننا ننفذ طرقًا على بنية عامة:

Rust
struct Container<T> {
    value: T,
}

impl<T> Container<T> {
    fn new(value: T) -> Self {
        Container { value }
    }

    fn value(&self) -> &T {
        &self.value
    }
}

جربه بنفسك

التمرين 1: البنية النقطية

تمرين#rust.m5.l1.e1
المحاولات: 0جارٍ التحميل…

حدد بنية عامة تسمى Point<T> بحقلين: x من النوع T وy من النوع T. في الوظيفة الرئيسية، قم بإنشاء نقطة متغيرة تحتوي على نقطة ذات قيم عددية x = 5 وy = 10، ثم اطبع قيمة point.x.

جارٍ تحميل المحرر…
إظهار التلميح

قم بتعريف البنية باستخدام `struct Point<T> { x: T, y: T }`. قم بإنشاء مثيل له بشكل رئيسي واستخدم "point.x" لطباعته.

الحل متاح بعد 3 من المحاولات

التمرين 2: عكس Tuple مع المبادلة

تمرين#rust.m5.l1.e2
المحاولات: 0جارٍ التحميل…

اكتب دالة عامة باسم Swap<T> تقبل صفًا من عنصرين (T, T) وترجع صفًا جديدًا (T, T) مع عكس مواضعهما. في الوظيفة الرئيسية، قم باستدعاء الوظيفة باستخدام الصف (1، 2) وطباعة النتيجة.

جارٍ تحميل المحرر…
إظهار التلميح

يجب أن يكون توقيع الدالة `fn Swap<T>(pair: (T, T)) -> (T, T)`. قم بإرجاع الصف المعكوس باستخدام `(pair.1, Pair.0)`.

الحل متاح بعد 3 من المحاولات

التمرين 3: هيكل الحاوية

تمرين#rust.m5.l1.e3
المحاولات: 0جارٍ التحميل…

حدد حاوية بنية عامة<T> تحتوي على حقل قيمة من النوع T. قم بتنفيذ كتلة ضمنية عامة لتحديد طريقة جديدة تقبل قيمة من النوع T وترجع مثيل الحاوية<T>.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `impl<T> Container<T>`لتنفيذ الطريقة المرتبطة`fn new(value: T) -> Self { Container { value } }`.

الحل متاح بعد 3 من المحاولات