كتابة شيفرة عامة في Rust
تعلّموا كتابة دوال وهياكل بيانات تعمل مع أنواع متعددة، مما يعزز قابلية إعادة استخدام الشيفرة دون التضحية بسلامة الأنواع.
كتابة شيفرة عامة في Rust درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 3 دروس في المجموع.
لماذا نكتب كودًا عامًا؟
تخيلوا أنكم بحاجة إلى دالة تعثر على أكبر عنصر في قائمة. ماذا لو احتجتم إليها مع الأرقام، ثم مع المحارف، ثم مع الكائنات المخصصة؟
من دون الأنواع العامة، ستكتبون دالة منفصلة لكل نوع، مما يؤدي إلى تكرار كبير في الكود. وهنا يأتي دور الأنواع العامة!
التعريف بالأنواع العامة
تتيح لك الأنواع العامة كتابة تعليمات برمجية تعمل مع أنواع متعددة دون تكرارها. وهي طريقة لكتابة دوال أو هياكل بيانات مرنة وقابلة لإعادة الاستخدام.
فكّر فيها على أنها مخطط يمكن تكييفه مع مواد مختلفة.
دالتك العامة الأولى
لجعل الدالة عامة، نُعلن عن معاملات الأنواع بين قوسين زاويين <> بعد اسم الدالة. ومن الأسماء الشائعة لمعامل النوع T (اختصارًا لـ Type).
يمكن لدالة print_anything الآن طباعة أي نوع!
fn print_anything<T>(item: T) {
println!("The item is: {}", item);
}
pub fn main() {
print_anything(5);
print_anything("hello");
print_anything(true);
}شرح معاملات الأنواع
يشير <T> في fn print_anything<T>(item: T) إلى أن T عنصر نائب لنوع. عند استدعاء الدالة باستخدام i32، تصبح قيمة T هي i32.
- معاملات الأنواع: تُسمّى الأنواع العامة عادةً باستخدام أحرف كبيرة مثل
TوUوV. - المرونة: يحدّد المترجم النوع الفعلي في وقت الترجمة.
إضافة السلوك: قيود السمات
قد تحتاج الدالة العامة أحيانًا إلى أن يمتلك معامل النوع T سلوكيات محددة. فمثلًا، إذا أردت مقارنة قيمتين من النوع T، فيجب أن يكون T قابلًا للمقارنة.
نضيف قيود السمات لتحديد هذه المتطلبات. وفي هذه الحالة، يعني T: PartialOrd + Copy أن على T تنفيذ سمتي PartialOrd (الترتيب الجزئي للمقارنة) وCopy.
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
let mut largest = list[0];
for &item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}
pub fn main() {
let number_list = vec![34, 50, 25, 100, 65];
println!("Largest number: {}", largest(&number_list));
let char_list = vec!['y', 'm', 'a', 'q'];
println!("Largest char: {}", largest(&char_list));
}صياغة قيود السمات المتعددة
يمكنك طلب سمات متعددة لنوع عام باستخدام صياغة +، مثل T: TraitA + TraitB.
أما في القيود المعقدة، فيمكنك أيضًا استخدام جملة where بعد توقيع الدالة، ما قد يجعل التوقيع أوضح:
fn some_function<T, U>(t: T, u: U) -> i32 where T: Display + Clone, U: Clone + Debug { /* ... */ }
الهياكل العامة
كما هو الحال مع الدوال، يمكنك تعريف هياكل لتكون عامة باستخدام معامل نوع واحد أو أكثر. يتيح ذلك لهياكل البيانات تخزين بيانات من أي نوع محدد.
يمكن للهيكل Point<T> تخزين إحداثيات من أي نوع T، مثل i32 وf64.
struct Point<T> {
x: T,
y: T,
}
pub fn main() {
let integer_point = Point {
x: 5,
y: 10
};
let float_point = Point {
x: 1.0,
y: 4.0
};
println!("Int Point: ({}, {})",
integer_point.x, integer_point.y);
println!("Float Point: ({}, {})",
float_point.x, float_point.y);
}تنفيذ الأساليب على الهياكل العامة
عند تنفيذ أساليب لهيكل عام، يجب تحديد معاملات النوع العامة بعد impl.
يمكنك أيضًا إضافة قيود سمات إلى الأساليب إذا كانت إحدى الأساليب تتطلب سلوكًا معينًا من أنواعها العامة.
struct Point<T> {
x: T,
y: T,
}
impl<T> Point<T> {
fn x(&self) -> &T {
&self.x
}
}
pub fn main() {
let p = Point {
x: 5,
y: 10
};
println!("p.x = {}", p.x());
}الأنواع العامة والأداء
من نقاط قوة Rust أن الأنواع العامة تُعد تجريدًا بلا تكلفة. وهذا يعني أن استخدام الأنواع العامة لا يضيف أي تكلفة إلى أداء البرنامج أثناء التشغيل.
تحقق Rust ذلك من خلال التخصيص الأحادي: إذ ينشئ المترجم في وقت الترجمة إصدارات متخصصة من التعليمات البرمجية العامة لكل نوع فعلي تُستخدم معه. لذلك تصبح largest<i32> وlargest<char> دالتين منفصلتين ومحسّنتين.
اختبر معلوماتك
أي العبارات التالية حول الأنواع العامة في Rust صحيحة؟
مراجعة: قوة الأنواع العامة
لقد تعلمت في هذا الدرس أساسيات كتابة تعليمات برمجية عامة في Rust:
- ماهيتها: طريقة لكتابة تعليمات برمجية مرنة وقابلة لإعادة الاستخدام.
- الدوال العامة: استخدام
<T>لمعاملات الأنواع. - قيود السمات: تحديد السلوكيات المطلوبة باستخدام
T: Trait. - الهياكل العامة: إنشاء هياكل بيانات تحتوي على أنواع عامة.
- بلا تكلفة: تُترجم الأنواع العامة في Rust إلى تعليمات برمجية محددة، ما يضمن عدم وجود تكلفة إضافية أثناء التشغيل.
تُعد الأنواع العامة ركيزة أساسية في أسلوب Rust الاصطلاحي، إذ تتيح تجريدات قوية وآمنة من ناحية الأنواع!
الأسئلة الشائعة
هل درس «كتابة شيفرة عامة في Rust» مجاني؟
نعم — نص درس «كتابة شيفرة عامة في Rust» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 3 دروس في المجموع.
ماذا ستتعلم في «كتابة شيفرة عامة في Rust»؟
تعلّموا كتابة دوال وهياكل بيانات تعمل مع أنواع متعددة، مما يعزز قابلية إعادة استخدام الشيفرة دون التضحية بسلامة الأنواع. تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.
كم من الوقت يستغرق درس «كتابة شيفرة عامة في Rust»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كتابة شيفرة عامة في Rust
- تعريف السمات وتنفيذها
- الاستخدام المتقدم للسمات: الأنواع المرتبطة