الوصول إلى عناصر الـ Vector
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 10 من 66.
بمجرد أن يكون لديك متجه (vector) يحتوي على عناصر، ستحتاج إلى الوصول إلى القيم الفردية. توفر لغة Rust طريقتين مختلفتين للحصول على العناصر من المتجه، لكل منهما مفاضلاتها الخاصة بين السهولة والأمان.
تستخدم الطريقة الأولى صيغة الفهرسة باستخدام الأقواس المربعة، بشكل مشابه للمصفوفات:
let numbers = vec![10, 20, 30, 40];
let first = numbers[0]; // يحصل على 10
let third = numbers[2]; // يحصل على 30بينما يعد هذا النحو مألوفاً ومختصراً، إلا أنه ينطوي على مخاطرة كبيرة: إذا حاولت الوصول إلى فهرس غير موجود، فسوف يتوقف برنامجك بشكل مفاجئ (panic) وينهار:
let numbers = vec![10, 20, 30];
let invalid = numbers[5]; // سيؤدي هذا إلى توقف مفاجئ (panic)!تستخدم الطريقة الثانية التابع .get()، والذي يوفر وصولاً آمناً:
let numbers = vec![10, 20, 30, 40];
let first = numbers.get(0); // تعيد Some(10)
let invalid = numbers.get(5); // تعيد Noneتُرجع الطريقة .get() النوع Option - إما Some(value) إذا كان الفهرس موجوداً، أو None إذا لم يكن موجوداً. هذا يجبرك على التعامل مع احتمالية عدم وجود العنصر، مما يمنع الانهيارات ويجعل الكود الخاص بك أكثر قوة.
التحدي
سهلاكتب دالة get_element_at تأخذ متجهًا numbers وفهرسًا idx، وتعيد العنصر الموجود في ذلك الفهرس باستخدام الوصول الآمن.
استخدم الطريقة .get() للوصول إلى العنصر بأمان. إذا كان الفهرس موجودًا، فقم بإرجاع القيمة. إذا لم يكن الفهرس موجودًا، فقم بإرجاع -1 كقيمة افتراضية.
المعاملات:
numbers(Vec<i32>): المتجه المراد الوصول إليهidx(i32): الفهرس المراد استرجاعه
المخرجات: العنصر الموجود في الفهرس المعطى، أو -1 إذا لم يكن الفهرس موجودًا (i32)
ورقة مرجعية
توفر لغة Rust طريقتين للوصول إلى عناصر المتجه (vector):
صيغة الفهرس (Index syntax) باستخدام الأقواس المربعة:
let numbers = vec![10, 20, 30, 40];
let first = numbers[0]; // يحصل على 10
let third = numbers[2]; // يحصل على 30ستتسبب هذه الطريقة في حدوث panic إذا كان الفهرس غير موجود:
let invalid = numbers[5]; // سيحدث panic هنا!طريقة .get() للوصول الآمن:
let numbers = vec![10, 20, 30, 40];
let first = numbers.get(0); // تعيد Some(10)
let invalid = numbers.get(5); // تعيد Noneتعيد طريقة .get() نوع Option - إما Some(value) إذا كان الفهرس موجوداً، أو None إذا لم يكن موجوداً. هذا يمنع الانهيارات ويتطلب معالجة صريحة للعناصر المفقودة.
جرّب بنفسك
fn get_element_at(numbers: Vec<i32>, idx: 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى