Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الـ 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 كتابة منطق قابل لإعادة الاستخدام مرة واحدة وتطبيقه على العديد من الأنواع، مما يقلل من تكرار التعليمات البرمجية مع الحفاظ على أمان الأنواع.

challenge icon

التحدي

سهل

لنبنِ وحدة أدوات تحتوي على 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 الأدوات الخاصة بك من خلال:

  1. استخدام wrap_in_pair مع integer (input first، الذي تم تحليله كـ i32) وطباعة العنصرين
  2. استخدام wrap_in_pair مع string (input second) وطباعة العنصرين
  3. استخدام 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})
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت