شرائح أخرى
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 57 من 66.
بينما تُعد شرائح السلاسل النصية (string slices) مفيدة جدًا، فإن عملية التقطيع (slicing) لا تقتصر على السلاسل النصية فقط. يمتد مفهوم الشريحة (slice) في Rust ليشمل أي تسلسل من العناصر، مما يجعلها أداة قوية للتعامل مع المجموعات دون نقل الملكية (ownership).
يمكنك إنشاء شرائح (slices) من المصفوفات (arrays) والمتجهات (vectors) باستخدام نفس الصيغة التي تعلمتها للسلاسل النصية. على سبيل المثال، إذا كان لديك مصفوفة من الأرقام، يمكنك إنشاء شريحة تشير إلى جزء منها أو إليها بالكامل:
let numbers = [1, 2, 3, 4, 5];
let slice: &[i32] = &numbers[1..4]; // هذا يعطينا [2, 3, 4]
let full_slice: &[i32] = &numbers; // هذا يشير إلى المصفوفة بأكملهايعمل المبدأ نفسه مع المتجهات (vectors). يمكنك إنشاء شرائح (slices) من المتجهات للتعامل مع أجزاء من البيانات دون نقلها أو نسخها:
let mut vec = vec![10, 20, 30, 40];
let vec_slice: &[i32] = &vec[0..2]; // هذا يعطينا [10, 20]التحدي
سهلستتلقى ثلاثة مدخلات. المدخل الأول عبارة عن قائمة أرقام مفصولة بفاصلة. المدخل الثاني عبارة عن رقمين مفصولين بمسافة يمثلان مؤشري البداية والنهاية لإنشاء شريحة (slice). المدخل الثالث عبارة عن رقم واحد يمثل مؤشراً للوصول إلى عنصر من الشريحة.
قم بإنشاء متجه (vector) من الأرقام المفصولة بفاصلة، ثم أنشئ شريحة باستخدام النطاق المحدد. قم بالوصول إلى العنصر الموجود في المؤشر المعطى من الشريحة وقم بطباعته.
المتطلبات:
- اقرأ المدخل الأول (الأرقام المفصولة بفاصلة) وقم بإزالة المسافات الزائدة (trim)
- قم بتقسيم المدخل بواسطة الفواصل وتحليل كل رقم إلى
i32 - أنشئ متجهاً (vector) من هذه الأرقام
- اقرأ المدخل الثاني (رقمين مفصولين بمسافة) وقم بإزالة المسافات الزائدة
- قم بتقسيم المدخل الثاني بواسطة المسافة للحصول على مؤشري البداية والنهاية
- قم بتحليل كلا المؤشرين إلى
usize - أنشئ شريحة من المتجه باستخدام صيغة النطاق
&vec[start..end] - اقرأ المدخل الثالث (المؤشر المطلوب الوصول إليه) وقم بإزالة المسافات الزائدة
- قم بتحليل المؤشر إلى
usize - قم بالوصول إلى العنصر الموجود في المؤشر المحدد من الشريحة
- اطبع العنصر الذي تم الوصول إليه
المدخلات:
- السطر الأول: أرقام مفصولة بفاصلة (مثال:
10,20,30,40,50) - السطر الثاني: رقمين مفصولين بمسافة (مثال:
1 4) - السطر الثالث: رقم المؤشر (مثال:
2)
المخرجات:
- العنصر الموجود في المؤشر المحدد من الشريحة
ورقة مرجعية
يمكن إنشاء الشرائح (Slices) من المصفوفات (arrays) والمتجهات (vectors)، وليس فقط من السلاسل النصية. فهي تشير إلى جزء من مجموعة دون الاستحواذ على ملكيتها.
إنشاء الشرائح من المصفوفات:
let numbers = [1, 2, 3, 4, 5];
let slice: &[i32] = &numbers[1..4]; // تشير إلى [2, 3, 4]
let full_slice: &[i32] = &numbers; // تشير إلى المصفوفة بأكملهاإنشاء الشرائح من المتجهات:
let mut vec = vec![10, 20, 30, 40];
let vec_slice: &[i32] = &vec[0..2]; // تشير إلى [10, 20]تستخدم الشرائح نفس صيغة النطاق (range syntax) المستخدمة في شرائح السلاسل النصية، وتسمح لك بالعمل مع أجزاء من البيانات دون نقلها أو نسخها.
جرّب بنفسك
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// قراءة المدخل الأول (أرقام مفصولة بفاصلة)
let first_input = lines.next().unwrap().unwrap();
// قراءة المدخل الثاني (مؤشرات البداية والنهاية)
let second_input = lines.next().unwrap().unwrap();
// قراءة المدخل الثالث (المؤشر المراد الوصول إليه)
let third_input = lines.next().unwrap().unwrap();
// TODO: اكتب كودك أدناه
// تحليل الأرقام المفصولة بفاصلة وإنشاء متجه (vector)
// تحليل مؤشرات البداية والنهاية
// إنشاء شريحة (slice) من المتجه
// الوصول إلى العنصر الموجود في المؤشر المحدد من الشريحة
// طباعة النتيجة
// println!("{}", result);
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى