حلقة For المحسنة
جزء من قسم الأساسيات في رحلة Rust على Coddy. الدرس 66 من 75.
توجد طرق مختلفة للتكرار على مصفوفة، إليك بعضًا منها:
ضع في اعتبارك المصفوفة التالية:
let numbers = [1, 2, 3, 4, 5];المكرّر المباشر:
for num in numbers.iter() {} // القيم: 1, 2, 3, 4, 5
index & القيمة:
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 هو شريحة، لذا يمكنك استخدام أساليب الشرائح عليه، فعلى سبيل المثال، تُرجع
chunk.len()عدد العناصر الموجودة في ذلك chunk. قد يكون chunk الأخير أصغر إذا لم تنقسم المصفوفة بالتساوي.
يمكنك أيضًا ربط .enumerate() بـ .chunks() للحصول على كلٍّ من index وchunk في الوقت نفسه:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// القيم: (0,[1,2]), (1,[3,4]), (2,[5])هنا، تنتج .chunks(2) الشرائح أولًا، ثم تغلّف .enumerate() كل واحدة منها بعدّاد، لذا فإن i هو index الخاص بـchunk، وchunk هو الشريحة.
التكرار مع التعديل:
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. - Apply خصمًا بنسبة 10% على جميع الأسعار (باستخدام
iter_mut). - طباعة الأسعار النهائية بعد الخصم، كل سعر في سطر جديد، مع تنسيقه إلى منزلتين عشريتين (مثلًا:
$2.48).
Hint: يمكنك ربط المُكررات معًا، على سبيل المثال، prices.chunks(2).enumerate() gives لك كلًا من فهرس chunk وقطعة chunk في آن واحد. كل chunk عبارة عن slice، لذا يمكنك استدعاء chunk.len() عليها وفهرستها باستخدام chunk[0] وchunk[1] وما إلى ذلك.
تنسيق output المتوقع للأسعار:
استخدم ${:.2} لتنسيق الأسعار إلى منزلتين عشريتين.
النص exact هو 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() لطباعة رقم كل عنصر والسعر
// Hint: prices.iter().enumerate() يعطي أزواج (index, &price)
// قم بتنسيق الأسعار إلى منزلتين عشريتين باستخدام {:.2}، راجع التعليمات للتنسيق الدقيق
println!("\nBundle Deals:");
// TODO: اربط chunks(2) و enumerate() معًا: prices.chunks(2).enumerate()
// هذا يعطي أزواج (index, chunk)، كل chunk هو شريحة، لذا chunk.len() يخبرك بحجمه
// If chunk.len() == 2, print: "Bundle 1: $2.75 + $1.50 = $4.25"
// إذا كان chunk.len() == 1، اطبع سطر العنصر الواحد الموضح في التعليمات
// استخدم {:.2} لتنسيق جميع الأسعار إلى منزلتين عشريتين
// TODO: Use iter_mut() to apply a 10% discount to all prices
// Hint: اضرب كل *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 عبر الإنترنت