الـ Functions العامة
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 27 من 61.
لا تقتصر Generics على الهياكل. يمكنك أيضًا كتابة function مستقلة تعمل مع أي نوع. يكون هذا مفيدًا عندما تحتاج إلى function مساعدة لا تنتمي إلى هيكل محدد، لكنها تظل مرنة.
يشبه syntax ما رأيته مع الهياكل. صرّح بالمعامل generic بين القوسين الزاويين بعد اسم function، ثم استخدمه في parameters ونوع الإرجاع:
fn identity<T>(value: T) -> T {
value
}
تأخذ دالة identity هذه قيمةً من أي نوع وتُعيدها دون تغيير. يعلن <T> عن النوع generic، وتقبل value: T القيمة كمعامل، بينما يحدّد -> T نوع القيمة المُعادة. عند استدعاء الدالة، يستنتج Rust النوع الفعلي:
let num = identity(42); // T هو i32
let text = identity("hello"); // T هو &str
يمكنك أيضًا استخدام parameters عامة متعددة في الدوال، تمامًا كما هو الحال مع الهياكل:
fn make_pair<T, U>(first: T, second: U) -> (T, U) {
(first, second)
}
let pair = make_pair(10, "ten"); // يُرجع (i32, &str)
تتيح لك الدوال generic كتابة منطق قابل لإعادة الاستخدام مرة واحدة وتطبيقه على العديد من الأنواع، مما يقلل من تكرار التعليمات البرمجية مع الحفاظ على أمان الأنواع.
التحدي
سهللنبنِ وحدة أدوات تحتوي على function عامة يمكنها العمل مع أي نوع! ستنشئ function مستقلة توضّح كيف تجعل الأنواع العامة كودك مرنًا وقابلًا لإعادة الاستخدام دون الارتباط بهيكل محدد.
ستنظّم كودك عبر ملفين:
utils.rs: أنشئ مجموعة من function العامة للأدوات:wrap_in_pair<T>: تأخذ قيمة single وتُرجع صفًا يحتوي على تلك القيمة مرتين:(value, value). يتطلب ذلك أن يكون النوعClone، لذا استخدم<T: Clone>swap<T, U>: تأخذ قيمتين من نوعين potentially مختلفين وتُرجعهما بترتيب reversed في صف هو(U, T)
main.rs: استورد وحدة الأدوات الخاصة بك وأظهر عمل هذه function العامة مع أنواع مختلفة. وضّح كيف تتعامل تعريفات function نفسها بسلاسة مع integer وfloat وstrings.
في ملفك الرئيسي، أظهر function الأدوات الخاصة بك من خلال:
- استخدام
wrap_in_pairمع integer (input first، الذي تم تحليله كـi32) وطباعة العنصرين - استخدام
wrap_in_pairمع string (input second) وطباعة العنصرين - استخدام
swapمع integer (input third، الذي تم تحليله كـi32) وstring (input fourth)، ثم طباعة النتيجة swapped
يجب أن يتبع إخراجك هذا التنسيق:
Pair of ints: ({value}, {value})
Pair of strings: ({value}, {value})
Swapped: ({string}, {int})على سبيل المثال، مع inputs 5 وhello و42 وworld:
Pair of ints: (5, 5)
Pair of strings: (hello, hello)
Swapped: (world, 42)لاحظ كيف تعمل wrap_in_pair بالطريقة نفسها مع كل من integer وstrings، وكيف تتعامل swap مع نوعين مختلفين تمامًا: هذه هي مرونة function العامة!
ستتلقى four inputs: integer، وstring، وinteger آخر، وstring أخرى.
جرّب بنفسك
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 واطبع النتيجة
// Format: 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 عبر الإنترنت