حلقة 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]
التحدي
سهلقم بإنشاء برنامج يعالج قائمة تسوق تحتوي على عناصر وأسعارها، ويوفر طرق عرض مختلفة للبيانات.
يجب على البرنامج:
- طباعة رقم كل عنصر وسعره (باستخدام
enumerate). بتنسيقItem N: $Price(على سبيل المثال،Item 1: $2.75). - طباعة الأسعار في أزواج (باستخدام
chunks) كـ "حزم عروض" (bundle deals). إذا كانت الحزمة تحتوي على عنصرين، اطبع المجموع:Bundle N: $Price1 + $Price2 = $Sum. وإذا كانت تحتوي على عنصر واحد فقط، اطبع:Bundle N: $Price. - تطبيق خصم بنسبة 10% على جميع الأسعار (باستخدام
iter_mut). - طباعة الأسعار النهائية بعد الخصم، كل منها في سطر جديد، منسقة إلى خانتين عشريتين (على سبيل المثال،
$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" إلخ.
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Fundamentals
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)اختصارات العمليات الحسابيةمعاملات المقارنةمقارنة النصوص7أساسيات الإدخال والإخراج
الطباعة على الكونسولقراءة مدخلات المستخدممراجعة - حتى 120مراجعة - True أو False2المتغيرات - الجزء الأول
الأرقامالمحارف (Char)النصوص (String)القيم المنطقية (Boolean)المتغيرات القابلة للتغيير5المعاملات - الجزء الثاني
المعاملات المنطقية - الجزء الأولالمعاملات المنطقية - الجزء الثانيمراجعة - المنطق البسيطالمعاملات المنطقية - الجزء الثالث11الدوال
تعريف الدوالالمعاملات والوسائطقيم الإرجاعقيم إرجاع متعددةمراجعة - دالة Sigmaمراجعة - دالة التحقق14التكرار عبر المصفوفات
دليل النطاق (Range)حلقة For المحسنةالاستعارة في الحلقةعمليات المصفوفات الشائعة3المتغيرات - الجزء الثاني
التصريح عن النوعقواعد التسميةاستنتاج النوعمراجعة - تهيئة المتغيراتتحويل الأنواع9الحلقات التكرارية
For عبر السلاسلحلقة Whileجملة Breakجملة Continueالحلقات المتداخلةتسميات الحلقاتالحلقة اللانهائيةمراجعة - الإدخال الديناميكي