التكرار عبر الـ Vector
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 11 من 66.
الآن بعد أن عرفت كيفية إنشاء المتجهات والوصول إلى العناصر الفردية، دعنا نتعلم كيفية معالجة كل عنصر في المتجه بشكل منهجي. تُعد حلقة for مثالية لهذه المهمة، مما يسمح لك بزيارة كل عنصر بالتسلسل.
إليك الصيغة الأساسية للتكرار عبر vector:
let names = vec!["Alice", "Bob", "Charlie"];
for name in &names {
println!("Hello, {}!", name);
}لاحظ الـ & قبل names - فهذا ينشئ مرجعاً للمتجه، مما يسمح لك بقراءة كل عنصر دون نقل ملكية المتجه نفسه. تمنحك كل دورة إمكانية الوصول إلى عنصر واحد في كل مرة من خلال متغير الحلقة name.
تتعامل حلقة for تلقائياً مع التحقق من الحدود من أجلك. وعلى عكس الفهرسة اليدوية، لن تحاول أبداً عن طريق الخطأ الوصول إلى عنصر غير موجود. ستقوم الحلقة بزيارة عدد العناصر التي يحتوي عليها المتجه (vector) بالضبط، مما يجعلها آمنة ومريحة في نفس الوقت.
يمكنك استخدام هذا النمط مع أي نوع من الـ vector:
let scores = vec![85, 92, 78, 90];
for score in &scores {
println!("Score: {}", score);
}هذا النهج هو الطريقة الأكثر شيوعاً واصطلاحاً لمعالجة جميع العناصر في المتجه (vector) عندما تحتاج إلى قراءة قيمها.
التحدي
سهلاكتب دالة sum_all_elements تأخذ متجهًا numbers وتعيد مجموع كل عناصره.
استخدم حلقة for للتكرار عبر المتجه وتجميع مجموع كل العناصر.
المعاملات:
numbers(Vec<i32>): المتجه من الأعداد الصحيحة لجمعها
القيمة المرجعة: مجموع كل العناصر في المتجه (i32)
ورقة مرجعية
لتكرار العناصر في متجه (vector)، استخدم حلقة for مع مرجع (reference) للمتجه:
let names = vec!["Alice", "Bob", "Charlie"];
for name in &names {
println!("Hello, {}!", name);
}الرمز & قبل اسم المتجه ينشئ مرجعاً، مما يسمح لك بقراءة كل عنصر دون نقل الملكية (ownership). تتعامل الحلقة تلقائياً مع التحقق من الحدود وتزور بالضبط عدد العناصر التي يحتوي عليها المتجه.
يعمل هذا النمط مع أي نوع من المتجهات:
let scores = vec![85, 92, 78, 90];
for score in &scores {
println!("Score: {}", score);
}جرّب بنفسك
fn sum_all_elements(numbers: Vec<i32>) -> i32 {
// اكتب الكود هنا
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى