0Pricing
Learn Rust Coding · درس

الإغلاقات

دوال مجهولة

الإغلاقات درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ما هي Closure؟

إن Closure دالة مجهولة يمكنكم تخزينها في متغير واستدعاؤها لاحقًا. وتُكتب باستخدام خطين عموديين حول المعاملات.

fn main() {
    let add_one = |x| x + 1;
    println!("{}", add_one(4));
}

صياغة Closure

توضع المعاملات بين |...|، ويتبعها الجسم. ومع وجود تعبير واحد، لا حاجة إلى الأقواس المعقوفة.

  • |x| x + 1 — معامل واحد.
  • |a, b| a + b — معاملان.
fn main() {
    let multiply = |a, b| a * b;
    println!("{}", multiply(3, 5));
}

Closures متعددة الأسطر

عند وجود أكثر من تعليمة، ضعوا الجسم بين قوسين معقوفين، كما تفعلون في الدالة.

fn main() {
    let describe = |n: i32| {
        let doubled = n * 2;
        println!("{} doubled is {}", n, doubled);
    };
    describe(7);
}

التقاط البيئة

بخلاف الدالة العادية، يمكن لـ Closure التقاط المتغيرات من النطاق المحيط واستخدامها بداخلها.

fn main() {
    let factor = 10;
    let scale = |x| x * factor;
    println!("{}", scale(5));
}

استنتاج الأنواع في Closures

تستنتج Closures عادةً أنواع معاملاتها وقيمها المُعادة من طريقة استخدامها، لذلك تكون تعيينات الأنواع اختيارية.

يمكنكم إضافة الأنواع للتوضيح عند الحاجة.

fn main() {
    let greet = |name: &str| -> String {
        format!("Hello, {}!", name)
    };
    println!("{}", greet("Rust"));
}

تمرير Closures كمعاملات

تقبل كثير من الدوال القياسية Closure. فعلى سبيل المثال، تطبق map Closure على كل عنصر.

fn main() {
    let nums = vec![1, 2, 3];
    let doubled: Vec<i32> = nums.iter().map(|x| x * 2).collect();
    println!("{:?}", doubled);
}

التصفية باستخدام Closures

تُبقي الطريقة filter على العناصر التي تُعيد Closure لها true فقط.

fn main() {
    let nums = vec![1, 2, 3, 4, 5, 6];
    let evens: Vec<i32> = nums.into_iter().filter(|x| x % 2 == 0).collect();
    println!("{:?}", evens);
}

تخزين Closures

تملك Closures أنواعًا مجهولة فريدة، لكن يمكنكم تخزينها في متغير وإعادة استخدامها.

fn main() {
    let is_even = |n: i32| n % 2 == 0;
    println!("{} {}", is_even(4), is_even(7));
}

Closures مقابل الدوال

الاختلافات:

  • لا تستطيع الدوال التقاط المتغيرات المحيطة، بينما تستطيع Closures ذلك.
  • Closures مجهولة وغالبًا ما تكون قصيرة.
  • تُستنتج أنواع Closures عادةً.
fn main() {
    let base = 100;
    let bonus = |earned: i32| earned + base;
    println!("{}", bonus(25));
}

إعادة القيم المحسوبة

ادمجوا Closures مع المكررات لحساب النتائج ضمن سلسلة معالجة واضحة وتعبيرية.

fn main() {
    let nums = vec![10, 20, 30];
    let total: i32 = nums.iter().map(|x| x + 1).sum();
    println!("total {}", total);
}

تلتقط Closures بالمرجع

تستعير Closure المتغيرات الملتقطة افتراضيًا. ولا يزال بإمكانكم قراءتها خارجها بعد ذلك (عند استعارتها فقط).

fn main() {
    let name = String::from("Ada");
    let printer = || println!("Name: {}", name);
    printer();
    println!("still usable: {}", name);
}

تحقق سريع

استرجعوا إحدى الإمكانات الأساسية لـ Closures.

مراجعة

Closures في Rust:

  • دوال مجهولة تُكتب بصيغة |params| body.
  • يمكنها التقاط المتغيرات من بيئتها.
  • تُستنتج أنواعها عادةً.
  • تُستخدم على نطاق واسع مع طرق المكررات مثل map وfilter.
fn main() {
    let tax = 0.2;
    let with_tax = |price: f64| price * (1.0 + tax);
    println!("{}", with_tax(50.0));
}

الأسئلة الشائعة

هل درس «الإغلاقات» مجاني؟

نعم — نص درس «الإغلاقات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ماذا ستتعلم في «الإغلاقات»؟

دوال مجهولة تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟

لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الإغلاقات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟

نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعريف الدوال
  2. التعبيرات والتعليمات
  3. الإغلاقات
  4. Fn وFnMut وFnOnce
← العودة إلى Learn Rust Coding