الـ Functions العامة
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 27 من 61.
لا تقتصر الأنواع العامة على البُنى. يمكنك أيضًا كتابة دوال مستقلة تعمل مع أي نوع. وهذا مفيد عندما تحتاج إلى دالة مساعدة لا تنتمي إلى بنية محددة، لكنها تظل مرنة.
تُحاكي الصياغة ما رأيته مع البُنى. أعلن عن المعامل العام بين قوسين زاويين بعد اسم الدالة، ثم استخدمه في المعاملات ونوع القيمة المُعادة:
fn identity<T>(value: T) -> T {
value
}
تأخذ الدالة identity هذه قيمةً من أي نوع وتُعيدها دون تغيير. يعلن <T> عن النوع العام، ويقبل value: T هذه القيمة بوصفها وسيطًا، ويحدّد -> T نوع القيمة المُعادة. عند استدعاء الدالة، يستنتج Rust النوع المحدد:
let num = identity(42); // T هو i32
let text = identity("hello"); // T هو &str
يمكنك أيضًا استخدام عدة معلمات عامة في الدوال، تمامًا كما هو الحال مع البُنى:
fn make_pair<T, U>(first: T, second: U) -> (T, U) {
(first, second)
}
let pair = make_pair(10, "ten"); // يُرجع (i32, &str)
تتيح لك الدوال العامة كتابة منطق قابل لإعادة الاستخدام مرة واحدة وتطبيقه على أنواع متعددة، مما يقلل تكرار الشيفرة مع الحفاظ على أمان الأنواع.
التحدي
سهللنبنِ وحدةً للأدوات المساعدة تحتوي على دوال عامة يمكنها العمل مع أي نوع! ستنشئ دوال مستقلة توضّح كيف تجعل الأنواع العامة شيفرتك مرنة وقابلة لإعادة الاستخدام دون الارتباط ببنية محددة.
ستنظّم شيفرتك في ملفين:
utils.rs: أنشئ مجموعة من دوال الأدوات المساعدة العامة والعامة الإتاحة:wrap_in_pair<T>: تستقبل قيمة واحدة وتُعيد صفًّا يحتوي على تلك القيمة مرتين:(value, value). يتطلب هذا أن يكون النوعClone، لذا استخدم<T: Clone>swap<T, U>: تستقبل قيمتين قد تكونان من نوعين مختلفين، وتُعيدهما بترتيب معكوس ضمن صفّ(U, T)
main.rs: استورد وحدة الأدوات المساعدة واعرض عمل هذه الدوال العامة مع أنواع مختلفة. وضّح كيف تتعامل تعريفات الدوال نفسها مع الأعداد الصحيحة والعشرية والسلاسل النصية بسلاسة.
في ملفك الرئيسي، اعرض دوال الأدوات المساعدة كما يلي:
- استخدم
wrap_in_pairمع عدد صحيح (المدخل الأول، ويُحلَّل على أنهi32) واطبع كلا العنصرين - استخدم
wrap_in_pairمع سلسلة نصية (المدخل الثاني) واطبع كلا العنصرين - استخدم
swapمع عدد صحيح (المدخل الثالث، ويُحلَّل على أنهi32) وسلسلة نصية (المدخل الرابع)، ثم اطبع النتيجة بعد التبديل
يجب أن يتبع الناتج هذا التنسيق:
Pair of ints: ({value}, {value})
Pair of strings: ({value}, {value})
Swapped: ({string}, {int})على سبيل المثال، مع المدخلات 5 وhello و42 وworld:
Pair of ints: (5, 5)
Pair of strings: (hello, hello)
Swapped: (world, 42)لاحظ كيف تعمل wrap_in_pair بالطريقة نفسها مع الأعداد الصحيحة والسلاسل النصية، وكيف تتعامل swap مع نوعين مختلفين تمامًا: هذه هي مرونة الدوال العامة!
ستتلقى أربعة مدخلات: عددًا صحيحًا، وسلسلة نصية، وعددًا صحيحًا آخر، وسلسلة نصية أخرى.
جرّب بنفسك
mod utils;
use std::io;
fn main() {
// اقرأ المدخلات الأربعة
let mut input1 = String::new();
io::stdin().read_line(&mut input1).expect("Failed to read line");
let num1: i32 = input1.trim().parse().expect("Invalid integer");
let mut input2 = String::new();
io::stdin().read_line(&mut input2).expect("Failed to read line");
let str1 = input2.trim().to_string();
let mut input3 = String::new();
io::stdin().read_line(&mut input3).expect("Failed to read line");
let num2: i32 = input3.trim().parse().expect("Invalid integer");
let mut input4 = String::new();
io::stdin().read_line(&mut input4).expect("Failed to read line");
let str2 = input4.trim().to_string();
// TODO: استخدم wrap_in_pair مع num1 واطبع النتيجة
// التنسيق: Pair of ints: ({value}, {value})
// TODO: استخدم wrap_in_pair مع str1 واطبع النتيجة
// التنسيق: Pair of strings: ({value}, {value})
// TODO: استخدم swap مع num2 وstr2، ثم اطبع النتيجة بعد التبديل
// التنسيق: Swapped: ({string}, {int})
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت