حلقة For المحسنة
جزء من قسم الأساسيات في رحلة Rust على Coddy. الدرس 66 من 75.
هناك طرق مختلفة للتكرار على مصفوفة، وإليك بعضًا منها:
تأمّل المصفوفة التالية:
let numbers = [1, 2, 3, 4, 5];مكرّر مباشر:
for num in numbers.iter() {} // القيم: 1, 2, 3, 4, 5
الفهرس والقيمة:
for (index, value) in numbers.iter().enumerate() { } // القيم: (0,1), (1,2), (2,3), (3,4), (4,5)
شرائح بحجم محدد:
for chunk in numbers.chunks(2) { } // القيم: [1,2], [3,4], [5]كل جزء هو شريحة، لذا يمكنك استخدام طرق الشرائح عليه، فعلى سبيل المثال، تُعيد
chunk.len()عدد العناصر الموجودة في ذلك الجزء. قد يكون الجزء الأخير أصغر إذا لم يكن حجم المصفوفة قابلًا للقسمة بالتساوي.
يمكنك أيضًا إلحاق .enumerate() بـ .chunks() للحصول على فهرس والقطعة في الوقت نفسه:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// القيم: (0,[1,2]), (1,[3,4]), (2,[5])هنا، تُنتج .chunks(2) الشرائح أولًا، ثم تُرفق .enumerate() بكل واحدة منها عدّادًا، لذا فإن i هو فهرس القطعة وchunk هي الشريحة.
التكرار مع التعديل:
let mut numbers = [1, 2, 3, 4, 5]; for num in numbers.iter_mut() { *num *= 2; } // تصبح المصفوفة: [2, 4, 6, 8, 10]
التحدي
سهلأنشئ برنامجًا يعالج قائمة تسوق تضم عناصر وأسعارها، ويعرض البيانات بطرق مختلفة.
ينبغي أن يقوم البرنامج بما يلي:
- طباعة رقم كل عنصر وسعره (باستخدام
enumerate). نسّقها بالشكلItem N: $Price(مثلًا،Item 1: $2.75). - طباعة الأسعار في أزواج (باستخدام
chunks) على شكل «عروض الحزم». إذا كانت الحزمة تضم عنصرين، فاطبع المجموع:Bundle N: $Price1 + $Price2 = $Sum. وإذا كانت تضم عنصرًا واحدًا فقط، فاطبع:Bundle N: $Price. - تطبيق خصم بنسبة 10% على جميع الأسعار (باستخدام
iter_mut). - طباعة الأسعار النهائية بعد الخصم، كل سعر في سطر جديد، مع تنسيقه إلى منزلتين عشريتين (مثلًا،
$2.48).
تلميح: يمكنك ربط المكررات بعضها ببعض؛ فعلى سبيل المثال، يمنحك prices.chunks(2).enumerate() فهرس كل مجموعة وشريحة المجموعة معًا. كل chunk عبارة عن شريحة، لذا يمكنك استدعاء chunk.len() عليها والوصول إلى عناصرها باستخدام الفهرسة مثل chunk[0] وchunk[1] وغيرها.
التنسيق المتوقع للأسعار:
استخدم ${:.2} لتنسيق الأسعار إلى منزلتين عشريتين.
النص المطابق تمامًا هو Bundle 4: $7.90.
جرّب بنفسك
fn main() {
let mut prices = [2.75, 1.50, 5.00, 3.5, 4.1, 2.25, 7.9];
println!("Original Prices:");
// TODO: استخدم enumerate() لطباعة رقم كل عنصر وسعره
// تلميح: تُرجع prices.iter().enumerate() أزواجًا من (index, &price)
// نسّق الأسعار إلى منزلتين عشريتين باستخدام {:.2}، وراجع التعليمات لمعرفة التنسيق الدقيق
println!("\nBundle Deals:");
// TODO: اربط chunks(2) وenumerate() معًا: prices.chunks(2).enumerate()
// ينتج عن ذلك أزواج من (index, chunk)، وكل chunk عبارة عن شريحة، لذا تبيّن chunk.len() حجمها
// إذا كانت chunk.len() == 2، فاطبع: "Bundle 1: $2.75 + $1.50 = $4.25"
// إذا كانت chunk.len() == 1، فاطبع سطر العنصر الواحد الموضّح في التعليمات
// استخدم {:.2} لتنسيق جميع الأسعار إلى منزلتين عشريتين
// TODO: استخدم iter_mut() لتطبيق 10% discount على جميع الأسعار
// تلميح: اضرب كل *price في 0.9
println!("\nPrices after 10% discount:");
// TODO: اطبع كل سعر بعد الخصم منسّقًا إلى منزلتين عشريتين
// تنسيق المخرجات المتوقع موضّح في التعليمات
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)اختصارات العمليات الحسابيةمعاملات المقارنةمقارنة النصوص7أساسيات الإدخال والإخراج
الطباعة على الكونسولقراءة مدخلات المستخدممراجعة - حتى 120مراجعة - True أو False2المتغيرات - الجزء الأول
الأرقامالمحارف (Char)النصوص (String)القيم المنطقية (Boolean)المتغيرات القابلة للتغيير5المعاملات - الجزء الثاني
المعاملات المنطقية - الجزء الأولالمعاملات المنطقية - الجزء الثانيمراجعة - المنطق البسيطالمعاملات المنطقية - الجزء الثالث11الدوال
تعريف الدوالالمعاملات والوسائطقيم الإرجاعقيم إرجاع متعددةمراجعة - دالة Sigmaمراجعة - دالة التحقق14التكرار عبر المصفوفات
دليل النطاق (Range)حلقة For المحسنةالاستعارة في الحلقةعمليات المصفوفات الشائعة3المتغيرات - الجزء الثاني
التصريح عن النوعقواعد التسميةاستنتاج النوعمراجعة - تهيئة المتغيراتتحويل الأنواع9الحلقات التكرارية
For عبر السلاسلحلقة Whileجملة Breakجملة Continueالحلقات المتداخلةتسميات الحلقاتالحلقة اللانهائيةمراجعة - الإدخال الديناميكيتدرّب بنفسك: مترجم Rust عبر الإنترنت