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

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

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

تعد القدرة على التقاط واستخدام المتغيرات من البيئة المحيطة بها واحدة من أقوى ميزات الـ closures. فخلافاً للدوال العادية، يمكن للـ closures "رؤية" والوصول إلى المتغيرات الموجودة في نفس النطاق (scope) الذي عُرّفت فيه.

إليك كيفية عمل التقاط البيئة (environment capture):

fn main() {
    let x = 10;
    
    let my_closure = || {
        println!("The value of x is: {}", x);
    };
    
    my_closure(); // سيقوم هذا بطباعة "The value of x is: 10"
}

في هذا المثال، يقوم الـ closure بالتقاط المتغير x من النطاق المحيط ويستخدمه داخل جسمه. لا يحتاج الـ closure إلى تمرير x كمعامل - فهو يمتلك حق الوصول إليه تلقائياً.

يمكنك أيضاً التقاط المتغيرات واستخدامها في العمليات الحسابية:

let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // النتيجة هي 15
challenge icon

التحدي

سهل

ستتلقى مدخلين. المدخل الأول هو رقم يمثل السعر الأساسي (base price). المدخل الثاني هو رقم يمثل نسبة الخصم (discount percentage). قم بإنشاء closure يلتقط نسبة الخصم من البيئة المحيطة ويحسب السعر النهائي بعد تطبيق الخصم. استدعِ الـ closure باستخدام السعر الأساسي واطبع السعر النهائي.

المتطلبات:

  • اقرأ المدخل الأول (السعر الأساسي) وقم بإزالة المسافات البيضاء (trim)
  • قم بتحويله (parse) إلى نوع f64
  • اقرأ المدخل الثاني (نسبة الخصم) وقم بإزالة المسافات البيضاء (trim)
  • قم بتحويله (parse) إلى نوع f64
  • أنشئ closure يأخذ معاملًا واحدًا (السعر الأساسي) ويلتقط نسبة الخصم من البيئة المحيطة
  • يجب أن يحسب الـ closure السعر النهائي باستخدام الصيغة: base_price - (base_price * discount / 100.0)
  • استدعِ الـ closure مع السعر الأساسي
  • اطبع السعر النهائي

المدخلات:

  • السطر الأول: السعر الأساسي (مثلاً، 100.0)
  • السطر الثاني: نسبة الخصم (مثلاً، 20.0)

المخرجات:

  • السعر النهائي بعد تطبيق الخصم

ورقة مرجعية

يمكن للمغلقات (Closures) التقاط واستخدام المتغيرات من بيئتها المحيطة دون الحاجة إليها كمعلمات (parameters).

التقاط البيئة الأساسي:

let x = 10;

let my_closure = || {
    println!("The value of x is: {}", x);
};

my_closure(); // Prints "The value of x is: 10"

التقاط المتغيرات في الحسابات:

let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // result is 15

يقوم المغلق (closure) تلقائياً بالتقاط multiplier من النطاق المحيط واستخدامه في العملية الحسابية.

جرّب بنفسك

use std::io;

fn main() {
    // قراءة السعر الأساسي
    let mut base_price_input = String::new();
    io::stdin().read_line(&mut base_price_input).expect("Failed to read line");
    let base_price: f64 = base_price_input.trim().parse().expect("Invalid number");
    
    // قراءة نسبة الخصم
    let mut discount_input = String::new();
    io::stdin().read_line(&mut discount_input).expect("Failed to read line");
    let discount: f64 = discount_input.trim().parse().expect("Invalid number");
    
    // TODO: قم بإنشاء closure يلتقط الخصم ويحسب السعر النهائي
    // TODO: قم باستدعاء الـ closure مع السعر الأساسي
    
    // طباعة السعر النهائي
    // println!("{}", final_price);
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow