التقاط البيئة المحيطة
جزء من قسم 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التحدي
سهلستتلقى مدخلين. المدخل الأول هو رقم يمثل السعر الأساسي (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);
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
تعبير 'match'مطابقة قيم متعددةمطابقة النطاقاتتعبير 'if let'الحلقات التكرارية كتعبيراتمراجعة - محلل أوامر بسيط4تجميع البيانات باستخدام Structs
ما هو الـ Struct؟نظرة عامة على الـ Structsالوصول إلى حقول الـ Structالـ Structs القابلة للتعديلالـ Structs كمعاملات للدوالالـ Tuple Structsمراجعة - إنشاء Book Struct7معالجة الأخطاء باستخدام 'Result'
ما هو 'Result'؟استخدام 'match' مع 'Result'is_ok() و is_err()اختصارات: unwrap و expectعامل علامة الاستفهام '?'تحويل السلاسل النصية إلى أرقامملخص - دالة القسمة الآمنة10الـ Closures والدوال المجهولة
ما هو الـ Closure؟تعريف Closure بسيطالـ Closures مع المعاملاتالتقاط البيئة المحيطةملخص - Closure الجامع البسيط2مقدمة في الـ Vectors
ما هو الـ Vector؟إنشاء Vectorإضافة عناصر باستخدام pushالوصول إلى عناصر الـ Vectorالتكرار عبر الـ Vectorالتكرار القابل للتعديل (Mutable Iteration)إزالة العناصرمراجعة - متتبع نقاط بسيط5أزواج (المفتاح والقيمة) مع Hash Maps
ما هو Hash Map؟إنشاء Hash Mapإدراج أزواج (المفتاح والقيمة)الوصول إلى القيمالتكرار عبر Hash Mapتحديث قيمةإزالة زوجملخص - عداد الكلمات6التعامل مع غياب القيم باستخدام 'Option'
ما هو الـ 'Option'؟استخدام 'match' مع 'Option''is_some()' و 'is_none()'فك تغليف الـ 'Option'الدالة 'expect'توفير قيمة افتراضية: 'unwrap_or'مراجعة - البحث عن عنصر9شرائح الـ String والمزيد
String مقابل &strإنشاء شرائح الـ Stringالشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى