استخدام 'match' مع 'Option'
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 36 من 66.
الآن بعد أن فهمت ما هو Option، دعنا نتعلم الطريقة الأكثر شيوعاً وصراحة للتعامل معه: باستخدام تعبير match. يجبرك هذا النهج على مراعاة كلتا الحالتين المحتملتين - عندما تكون هناك قيمة وعندما لا تكون موجودة.
يعمل تعبير match بشكل مثالي مع Option لأنه يمكنك إنشاء أفرع (arms) لكلا المتغيرين:
let maybe_name = Some("Alice".to_string());
match maybe_name {
Some(name) => println!("Hello, {}!", name),
None => println!("Hello, stranger!"),
}لاحظ كيف يقوم ذراع Some(name) باستخراج القيمة من داخل البديل Some. يحتوي المتغير name الآن على الـ String الفعلية، وليس الـ Option. يُسمى هذا تفكيك البنية (destructuring) - فأنت تقوم بسحب القيمة الداخلية من الغلاف.
يعالج ذراع None الحالة التي لا توجد فيها قيمة، مما يسمح لك بتقديم سلوك بديل مثل عرض رسالة افتراضية أو اتخاذ إجراء مختلف تماماً.
التحدي
سهلستتلقى اسم طالب كمدخل. قد يكون الاسم موجوداً في النظام أو قد يكون مفقوداً. قم بإنشاء Option<String> يحتوي على Some(name) إذا لم يكن الاسم فارغاً، أو None إذا كان الاسم فارغاً. استخدم تعبير match للتعامل مع كلتا الحالتين وطباعة الرسالة المناسبة.
المتطلبات:
- اقرأ المدخلات كسلسلة نصية (اسم الطالب)
- قم بإزالة أي مسافات بيضاء من المدخلات باستخدام
.trim() - قم بإنشاء متغير من نوع
Option<String>:- إذا كان الاسم بعد التقليم ليس فارغاً، قم بتعيين
Some(name.to_string()) - إذا كان الاسم بعد التقليم فارغاً، قم بتعيين
None
- إذا كان الاسم بعد التقليم ليس فارغاً، قم بتعيين
- استخدم تعبير
matchللتعامل مع كلا نوعيOption - في ذراع
Some(name)، اطبع:Welcome, [name]! - في ذراع
None، اطبع:No name provided
المدخلات:
- سطر واحد يحتوي إما على اسم طالب أو سطر فارغ
المخرجات:
- إذا تم توفير اسم:
Welcome, [name]! - إذا لم يتم توفير اسم (مدخل فارغ):
No name provided
ورقة مرجعية
استخدم تعبير match للتعامل مع قيم Option من خلال إنشاء أفرع (arms) لكلا المتغيرين:
let maybe_name = Some("Alice".to_string());
match maybe_name {
Some(name) => println!("Hello, {}!", name),
None => println!("Hello, stranger!"),
}يستخدم فرع Some(name) عملية **التفكيك (destructuring)** لاستخراج القيمة الداخلية من متغير Some. يحتوي المتغير name على القيمة الفعلية، وليس غلاف Option.
يتعامل فرع None مع الحالة التي لا توجد فيها قيمة، مما يسمح لك بتقديم سلوك بديل.
جرّب بنفسك
use std::io;
fn main() {
// قراءة المدخلات
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim();
// TODO: بناءً على ما إذا كان الاسم فارغاً أم لا Option<String> قم بإنشاء
// TODO: للتعامل مع حالتي البعض والعدم وطباعة الرسالة المناسبة match استخدم تعبير
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى