الـ 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التحدي
سهلستتلقى مدخلين. المدخل الأول هو رقم، والمدخل الثاني هو رقم أيضاً. قم بإنشاء 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);
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى