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

الـ Closures مع المعاملات

جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 61 من 66.

في حين أن الإغلاقات (closures) التي لا تأخذ بارامترات (parameters) مفيدة، إلا أنك في معظم الأوقات سترغب في تمرير البيانات إلى الإغلاقات الخاصة بك لجعلها أكثر مرونة وقوة. يتبع إضافة البارامترات إلى الإغلاقات نفس النمط الذي تعلمته سابقاً، ولكن مع وضع القيم داخل الأشرطة الرأسية (vertical bars).

إليك كيفية تعريف closure يقبل بارامترًا واحدًا:

let add_one = |x: i32| x + 1;

لاحظ أن المعامل x يوضع بين الخطين الرأسيين، تماماً مثل معاملات الدوال. يمكنك بعد ذلك استدعاء هذا الإغلاق (closure) عن طريق تمرير قيمة:

let add_one = |x: i32| x + 1;
let result = add_one(5); // النتيجة هي 6

بالنسبة للإغلاقات (closures) التي تحتوي على معلمات متعددة، افصل بينها بفاصلات:

let multiply = |x: i32, y: i32| x * y;
let result = multiply(3, 4); // النتيجة هي 12
challenge icon

التحدي

سهل

ستتلقى مدخلين. المدخل الأول هو رقم، والمدخل الثاني هو رقم أيضاً. قم بإنشاء closure يأخذ معاملين ويحسب القوة (المعامل الأول مرفوعاً لأس المعامل الثاني). قم بتخزين الـ closure في متغير، واستدعه باستخدام قيم المدخلات، ثم اطبع النتيجة.

المتطلبات:

  • اقرأ المدخل الأول (الرقم الأساسي) وقم بإزالة المسافات البيضاء
  • قم بتحويله إلى i32
  • اقرأ المدخل الثاني (الأس) وقم بإزالة المسافات البيضاء
  • قم بتحويله إلى u32
  • أنشئ closure بمعاملين يحسب القوة باستخدام طريقة .pow()
  • قم بتخزين الـ closure في متغير
  • استدعِ الـ closure بكلا قيمتي المدخلات
  • اطبع النتيجة

المدخلات:

  • السطر الأول: الرقم الأساسي (على سبيل المثال، 2)
  • السطر الثاني: الأس (على سبيل المثال، 3)

المخرجات:

  • نتيجة حساب القوة

ورقة مرجعية

يمكن للمغلقات (Closures) قبول المعاملات عن طريق وضعها بين الخطين الرأسيين ||:

let add_one = |x: i32| x + 1;
let result = add_one(5); // النتيجة هي 6

بالنسبة للمعاملات المتعددة، افصل بينها بفاصلات:

let multiply = |x: i32, y: i32| x * y;
let result = multiply(3, 4); // النتيجة هي 12

جرّب بنفسك

use std::io;

fn main() {
    // قراءة المدخل الأول (الرقم الأساسي)
    let mut base_input = String::new();
    io::stdin().read_line(&mut base_input).expect("Failed to read line");
    let base: i32 = base_input.trim().parse().expect("Invalid number");
    
    // قراءة المدخل الثاني (الأس)
    let mut exp_input = String::new();
    io::stdin().read_line(&mut exp_input).expect("Failed to read line");
    let exponent: u32 = exp_input.trim().parse().expect("Invalid number");
    
    // TODO: قم بإنشاء closure يحسب القوة وقم بتخزينه في متغير
    // TODO: استدعِ الـ closure مع الأساس والأس
    
    // طباعة النتيجة
    println!("{}", result);
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow