إزالة العناصر
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 13 من 66.
في بعض الأحيان تحتاج إلى إزالة عناصر من الـ vector، وليس فقط إضافتها. توفر Rust طريقتين رئيسيتين لإزالة العناصر، كل منهما مصممة لحالات مختلفة.
تزيل الطريقة .pop() العنصر الأخير من المتجه (vector) وتعيده:
let mut numbers = vec![10, 20, 30, 40];
let last = numbers.pop(); // تزيل 40، وتعيد Some(40)
// تصبح numbers الآن [10, 20, 30]لاحظ أن .pop() يعيد Option - فهو يعطيك Some(value) إذا كان هناك عنصر لإزالته، أو None إذا كان المتجه (vector) فارغاً بالفعل. وهذا يجعله آمناً للاستخدام حتى مع المتجهات الفارغة.
تقوم الطريقة .remove() بإزالة عنصر عند فهرس محدد وتعيد ذلك العنصر:
let mut fruits = vec!["apple", "banana", "cherry"];
let removed = fruits.remove(1); // تزيل "banana"
// fruits هي الآن ["apple", "cherry"]عندما تستخدم .remove()، تنتقل جميع العناصر الموجودة بعد الفهرس الذي تمت إزالته إلى اليسار لملء الفجوة. يمكن أن تكون هذه العملية أبطأ بالنسبة للمتجهات (vectors) الكبيرة عند الإزالة من البداية أو المنتصف، نظرًا لأن العديد من العناصر تحتاج إلى النقل.
تتطلب كلتا الطريقتين أن يكون المتجه (vector) قابلاً للتغيير (mutable) لأنهما تعدلان محتوياته. اختر .pop() عندما تريد الإزالة من النهاية، و .remove() عندما تحتاج إلى الإزالة من موضع محدد.
التحدي
سهلستتلقى مدخلين: الأول، قائمة أرقام مفصولة بفاصلة، والثاني، فهرس لإزالته. اقرأ كلا المدخلين، وأنشئ متجهًا (vector) من الأرقام، ثم أزل العنصر الموجود في الفهرس المحدد، واطبع العناصر المتبقية في أسطر منفصلة.
المتطلبات:
- اقرأ المدخل الأول الذي يحتوي على أرقام مفصولة بفاصلة (على سبيل المثال،
10,20,30,40,50) - قم بتقسيم السلسلة النصية بواسطة الفواصل وحوّل كل رقم إلى عدد صحيح
- أنشئ متجهًا قابلاً للتعديل (mutable vector) من هذه الأرقام
- اقرأ المدخل الثاني وحوّله إلى عدد صحيح يمثل الفهرس
- استخدم
.remove()لإزالة العنصر الموجود في ذلك الفهرس - اطبع كل عنصر متبقٍ في سطر منفصل
المدخلات:
- السطر الأول: أعداد صحيحة مفصولة بفاصلة (على سبيل المثال،
10,20,30,40,50) - السطر الثاني: عدد صحيح يمثل الفهرس المراد إزالته
المخرجات: اطبع كل عنصر متبقٍ من المتجه في سطر منفصل
ورقة مرجعية
يوفر Rust طريقتين رئيسيتين لإزالة العناصر من المتجهات (vectors):
تقوم الطريقة .pop() بإزالة العنصر الأخير وإرجاعه:
let mut numbers = vec![10, 20, 30, 40];
let last = numbers.pop(); // يزيل 40، ويعيد Some(40)
// numbers هي الآن [10, 20, 30]تعيد .pop() نوع Option - Some(value) إذا تمت إزالة عنصر، أو None إذا كان المتجه فارغاً.
تقوم الطريقة .remove() بإزالة عنصر عند فهرس (index) محدد وإرجاعه:
let mut fruits = vec!["apple", "banana", "cherry"];
let removed = fruits.remove(1); // يزيل "banana"
// fruits هي الآن ["apple", "cherry"]عند استخدام .remove()، تنتقل جميع العناصر الموجودة بعد الفهرس المزال إلى اليسار لملء الفجوة.
تتطلب كلتا الطريقتين أن يكون المتجه قابلاً للتغيير (mutable). استخدم .pop() للإزالة من النهاية، و .remove() للإزالة من موضع محدد.
جرّب بنفسك
use std::io;
fn main() {
// قراءة الأرقام المفصولة بفاصلة
let mut numbers_input = String::new();
io::stdin().read_line(&mut numbers_input).expect("Failed to read line");
// قراءة الفهرس المراد حذفه
let mut index_input = String::new();
io::stdin().read_line(&mut index_input).expect("Failed to read line");
// TODO: اكتب كودك أدناه
// 1. تقسيم numbers_input بواسطة الفواصل وتحويلها إلى أعداد صحيحة
// 2. إنشاء متجه (vector) قابل للتعديل من هذه الأرقام
// 3. تحويل index_input إلى عدد صحيح
// 4. إزالة العنصر الموجود في الفهرس المحدد
// 5. طباعة كل عنصر متبقٍ في سطر منفصل
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى