الانتقال إلى المحتوى الرئيسي
الوحدة 2 · الدرس 2 من 24/14 في الدورة~15 min
دروس الوحدة (2/2)

مطابقة الأنماط والخيار والنتيجة

يتمتع الصدأ بآلية تحكم قوية للغاية في التدفق تسمى مطابقة الأنماط. فهو يسمح لك بمقارنة قيمة بسلسلة من الأنماط وتنفيذ التعليمات البرمجية بناءً على النمط المطابق.

بيان match

عبارة match في Rust تشبه عبارة switch في اللغات الأخرى، ولكنها أكثر قوة وأمانًا. يضمن المترجم أن تكون المطابقة شاملة، مما يعني أنه يجب التعامل مع جميع الحالات المحتملة:

Rust
enum Direction {
    North,
    South,
    East,
    West,
}

let dir = Direction::East;

match dir {
    Direction::North => println!("Andiamo a Nord"),
    Direction::South => println!("Andiamo a Sud"),
    Direction::East => println!("Andiamo a Est"),
    Direction::West => println!("Andiamo a Ovest"),
}

التعامل مع غياب القيمة: Option

لا يحتوي الصدأ على مفهوم القيمة الخالية (null أو nil). بدلاً من ذلك، تحدد المكتبة القياسية تعدادًا يسمى Option<T> والذي يمكن أن يحتوي على:

  • Some(T): يحتوي على قيمة من النوع T.
  • None: يشير إلى غياب القيمة.
Rust
let x: Option<i32> = Some(5);
let y: Option<i32> = None;

match x {
    Some(val) => println!("C'e un valore: {}", val),
    None => println!("Nessun valore trovato"),
}

معالجة الأخطاء القابلة للاسترداد: Result

بالنسبة للعمليات التي يمكن أن تفشل (مثل قراءة ملف أو تحليل سلسلة إلى رقم)، يستخدم Rust التعداد Result<T, E>، الذي يحتوي على متغيرين:

  • Ok(T): نجحت العملية وتحتوي على قيمة النجاح T.
  • Err(E): فشلت العملية وتحتوي على الخطأ E.
Rust
fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {
    if denominator == 0.0 {
        Err(String::from("Divisione per zero!"))
    } else {
        Ok(numerator / denominator)
    }
}

بفضل مترجم Rust، أنت مجبر على التعامل مع حالة Err قبل أن تتمكن من الوصول إلى القيمة الموجودة داخل Ok، مما يمنع العديد من الأخطاء الشائعة في وقت التشغيل.

نمط حرف البدل _

عند العمل مع أنواع البيانات التي تحتوي على عدد كبير من المتغيرات (مثل الأعداد الصحيحة)، يكون إدراج جميع الحالات في match أمرًا مستحيلًا. يسمح Rust باستخدام حرف البدل _ لالتقاط جميع الحالات المتبقية غير المحددة بشكل صريح:

Rust
let some_u8 = 3u8;
match some_u8 {
    1 => println!("One"),
    2 => println!("Two"),
    _ => println!("Something else"), // Handles all other values
}

جربه بنفسك

تمرين#rust.m2.l2.e1
المحاولات: 0جارٍ التحميل…

قم بتعريف متغير اسمه may_value من النوع Option<i32> الذي يحتوي على Some(42). استخدم عبارة مطابقة في may_value: إذا كانت تحتوي على بعض (v) فاطبع "القيمة هي: v" (باستخدام println!)، وإذا كانت تحتوي على لا شيء فاطبع "بلا قيمة".

جارٍ تحميل المحرر…
إظهار التلميح

اكتب `تطابق ربما_قيمة { Some(v) => println!('القيمة هي: {}', v), None => println!('no value') }` block.

الحل متاح بعد 3 من المحاولات

تمرين#rust.m2.l2.e2
المحاولات: 0جارٍ التحميل…

أكمل الدالة check_age بحيث تُرجع Ok('Adult') إذا كان العمر أكبر من أو يساوي 18، وErr('Minor') بخلاف ذلك.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `if age >= 18` لتحديد ما إذا كنت تريد إرجاع`Ok('Adult')`أو`Err('Minor')`.

الحل متاح بعد 3 من المحاولات

تمرين#rust.m2.l2.e3
المحاولات: 0جارٍ التحميل…

قم بتعريف التعداد المسمى الحالة الذي يحتوي على المتغيرات النشطة وغير النشطة. بشكل رئيسي، قم بتعريف المتغير current_status بالقيمة Status::Active. أخيرًا، استخدم عبارة المطابقة في current_status لطباعة "نشط" إذا كانت الحالة نشطة، أو "غير نشط" إذا كانت الحالة غير نشطة.

جارٍ تحميل المحرر…
إظهار التلميح

حدد التعداد قبل main باستخدام `enum Status { Active, Inactive }`. بشكل رئيسي، استخدم `let current_status = Status::Active;` وقم بإجراء المطابقة على المتغيرات.

الحل متاح بعد 3 من المحاولات