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

حلقة For المحسنة

جزء من قسم Fundamentals في رحلة Rust على Coddy — الدرس 66 من 75.

هناك طرق مختلفة للتكرار (iterate) على مصفوفة، وإليك بعضًا منها:
تأمل المصنوعة التالية:

let numbers = [1, 2, 3, 4, 5];
  • المكرر المباشر (Direct Iterator):

    for num in numbers.iter() {}
    // القيم: 1, 2, 3, 4, 5
  • الفهرس والقيمة (Index & Value):

    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 عبارة عن slice، لذا يمكنك استخدام طرق الـ slice عليه — على سبيل المثال، chunk.len() يرجع عدد العناصر الموجودة في تلك الـ chunk. قد تكون الـ chunk الأخيرة أصغر إذا لم تكن المصفوفة تقبل القسمة بالتساوي.

يمكنك أيضًا ربط .enumerate() بـ .chunks() للحصول على كل من الفهرس و chunk في نفس الوقت:

for (i, chunk) in numbers.chunks(2).enumerate() { }
// القيم: (0,[1,2]), (1,[3,4]), (2,[5])

هنا، ينتج .chunks(2) الشرائح أولاً، ثم يغلف .enumerate() كل منها بعداد — بحيث يكون i هو فهرس الـ chunk و chunk هو الـ slice.

  • التكرار مع التعديل (mutation):

    for num in numbers.iter_mut() { 
    	*num *= 2;
    }
    // المصفوفة تصبح: [2, 4, 6, 8, 10]
challenge icon

التحدي

سهل

قم بإنشاء برنامج يعالج قائمة تسوق تحتوي على عناصر وأسعارها، ويوفر طرق عرض مختلفة للبيانات.

يجب على البرنامج:

  1. طباعة رقم كل عنصر وسعره (باستخدام enumerate). بتنسيق Item N: $Price (على سبيل المثال، Item 1: $2.75).
  2. طباعة الأسعار في أزواج (باستخدام chunks) كـ "حزم عروض" (bundle deals). إذا كانت الحزمة تحتوي على عنصرين، اطبع المجموع: Bundle N: $Price1 + $Price2 = $Sum. وإذا كانت تحتوي على عنصر واحد فقط، اطبع: Bundle N: $Price.
  3. تطبيق خصم بنسبة 10% على جميع الأسعار (باستخدام iter_mut).
  4. طباعة الأسعار النهائية بعد الخصم، كل منها في سطر جديد، منسقة إلى خانتين عشريتين (على سبيل المثال، $2.48).

Hint: يمكنك ربط المكررات (iterators) معًا — على سبيل المثال، prices.chunks(2).enumerate() يعطيك كلاً من فهرس الـ chunk وشريحة الـ chunk في نفس الوقت. كل chunk عبارة عن شريحة (slice)، لذا يمكنك استدعاء chunk.len() عليها والوصول إلى عناصرها باستخدام chunk[0]، chunk[1]، إلخ.

Expected output format for prices:
استخدم ${:.2} لتنسيق الأسعار إلى خانتين عشريتين.

جرّب بنفسك

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} — مثلاً، "Item 1: $2.75"


    println!("\nBundle Deals:");
    // TODO: اربط chunks(2) و enumerate() معًا: prices.chunks(2).enumerate()
    // هذا يعطي أزواج (index, chunk) — كل chunk هو slice، لذا chunk.len() يخبرك بحجمه
    // If chunk.len() == 2, print: "Bundle 1: $2.75 + $1.50 = $4.25"
    // إذا كان chunk.len() == 1، اطبع: "Bundle 4: $7.90"
    // استخدم {:.2} لتنسيق جميع الأسعار إلى منزلتين عشريتين


    // TODO: استخدم iter_mut() لتطبيق خصم 10% على جميع الأسعار
    // تلميح: اضرب كل *price في 0.9


    println!("\nPrices after 10% discount:");
    // TODO: اطبع كل سعر بعد الخصم منسقًا إلى منزلتين عشريتين
    // المتوقع: "$2.48" إلخ.

}
quiz iconاختبر نفسك

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

جميع دروس Fundamentals