دروس الوحدة (1/2)
الأدوية العامة والوظائف
الأدوية العامة تسمح لك بكتابة تعليمات برمجية مرنة وقابلة لإعادة الاستخدام، وتجنب تكرار المنطق لأنواع البيانات المختلفة. بدلاً من تحديد وظائف أو بنيات متعددة لأنواع مختلفة (مثل i32، أو f64، أو String)، يمكننا استخدام معلمة نوع عامة، يتم تمثيلها تقليديًا بالحرف T.
يقوم مترجم Rust بإدارة الأدوية العامة باستخدام عملية تسمى monomorphization: أثناء التجميع، يقوم بإنشاء نسخة من الكود العام لكل نوع ملموس يتم استخدامه بالفعل. وهذا يعني أنه لا يوجد أي حمل إضافي لأداء وقت التشغيل.
وظائف عامة
لتعريف دالة عامة، نقوم بإدخال معلمة النوع <T> مباشرةً بعد اسم الوظيفة وقبل قائمة الوسائط:
fn print_value<T: std::fmt::Debug>(value: T) {
println!("Value: {:?}", value);
}في الدوال العامة، يمكننا استخدام النوع العام T لكل من أنواع الوسائط وأنواع الإرجاع:
fn identity<T>(value: T) -> T {
value
}الهياكل العامة
يمكننا أيضًا استخدام معلمات النوع العامة داخل الهياكل (struct) لتحديد الحقول المرنة:
struct KeyValuePair<K, V> {
key: K,
value: V,
}
fn main() {
let pair = KeyValuePair {
key: String::from("age"),
value: 30,
};
}في كتلة impl لبنية عامة، يجب أن نعلن عن معلمة النوع <T> مباشرةً بعد الكلمة الأساسية impl للإشارة إلى أننا ننفذ طرقًا على بنية عامة:
struct Container<T> {
value: T,
}
impl<T> Container<T> {
fn new(value: T) -> Self {
Container { value }
}
fn value(&self) -> &T {
&self.value
}
}جربه بنفسك
التمرين 1: البنية النقطية
حدد بنية عامة تسمى Point<T> بحقلين: x من النوع T وy من النوع T. في الوظيفة الرئيسية، قم بإنشاء نقطة متغيرة تحتوي على نقطة ذات قيم عددية x = 5 وy = 10، ثم اطبع قيمة point.x.
إظهار التلميح
قم بتعريف البنية باستخدام `struct Point<T> { x: T, y: T }`. قم بإنشاء مثيل له بشكل رئيسي واستخدم "point.x" لطباعته.
الحل متاح بعد 3 من المحاولات
التمرين 2: عكس Tuple مع المبادلة
اكتب دالة عامة باسم Swap<T> تقبل صفًا من عنصرين (T, T) وترجع صفًا جديدًا (T, T) مع عكس مواضعهما. في الوظيفة الرئيسية، قم باستدعاء الوظيفة باستخدام الصف (1، 2) وطباعة النتيجة.
إظهار التلميح
يجب أن يكون توقيع الدالة `fn Swap<T>(pair: (T, T)) -> (T, T)`. قم بإرجاع الصف المعكوس باستخدام `(pair.1, Pair.0)`.
الحل متاح بعد 3 من المحاولات
التمرين 3: هيكل الحاوية
حدد حاوية بنية عامة<T> تحتوي على حقل قيمة من النوع T. قم بتنفيذ كتلة ضمنية عامة لتحديد طريقة جديدة تقبل قيمة من النوع T وترجع مثيل الحاوية<T>.
إظهار التلميح
استخدم `impl<T> Container<T>`لتنفيذ الطريقة المرتبطة`fn new(value: T) -> Self { Container { value } }`.
الحل متاح بعد 3 من المحاولات