Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

فك تغليف الـ 'Option'

جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 38 من 66.

أحياناً تحتاج إلى استخراج القيمة الفعلية من Option عندما تكون واثقاً من أنها تحتوي على Some. توفر Rust ميثود .unwrap() لهذا الغرض - فهي تأخذ القيمة من Some وتعطيك إياها مباشرة.

let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);

عندما تستدعي .unwrap() على Some(value)، فإنه يعيد القيمة الداخلية. في المثال أعلاه، يصبح actual_number هو 42 - ولم يعد مغلفاً بـ Option.

ومع ذلك، هناك تحذير بالغ الأهمية: إذا قمت باستدعاء .unwrap() على None، فسوف يتوقف برنامجك (panic) وينهار على الفور. وهذا يجعل .unwrap() طريقة خطيرة محتملة يجب استخدامها فقط عندما تكون متأكداً تماماً من أن Option يحتوي على Some.

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // سيؤدي هذا إلى حدوث panic!

استخدم .unwrap() بشكل مقتصد وفقط في الحالات التي يمكنك فيها ضمان أن Option يحتوي على قيمة، كما هو الحال في الأمثلة البسيطة أو عندما تكون قد تحققت بالفعل باستخدام .is_some().

challenge icon

التحدي

سهل

ستتلقى مدخلين. المدخل الأول هو رقم (كسلسلة نصية)، والمدخل الثاني يشير إلى ما إذا كان يجب معاملة هذا الرقم كصالح (valid) أو غير صالح (invalid). إذا كان المدخل الثاني هو valid، فقم بإنشاء Option<i32> يحتوي على Some مع الرقم الذي تم تحويله. إذا كان المدخل الثاني هو invalid، فقم بإنشاء Option<i32> يحتوي على None. استخدم .unwrap() لاستخراج القيمة من Option وطباعتها.

المتطلبات:

  • اقرأ المدخل الأول وقم بإزالة المسافات البيضاء (trim)
  • اقرأ المدخل الثاني وقم بإزالة المسافات البيضاء (trim)
  • قم بتحويل المدخل الأول إلى i32 باستخدام .parse::<i32>()
  • أنشئ متغير Option<i32>:
    • إذا كان المدخل الثاني هو valid، فقم بتعيين Some(parsed_number)
    • إذا كان المدخل الثاني هو invalid، فقم بتعيين None
  • استخدم .unwrap() لاستخراج القيمة من Option
  • اطبع القيمة المستخرجة بالتنسيق التالي: Value: [number]

المدخلات:

  • السطر الأول: رقم في شكل سلسلة نصية (مثلاً، 42)
  • السطر الثاني: إما valid أو invalid

المخرجات:

  • إذا كان المدخل الثاني هو valid: Value: [number]
  • إذا كان المدخل الثاني هو invalid: سيحدث ذعر (panic) في البرنامج (هذا هو السلوك المتوقع لهذا التحدي)

ملاحظة: عندما يكون المدخل الثاني هو invalid، فإن استدعاء .unwrap() على None سيؤدي إلى حدوث panic. يوضح هذا الطبيعة الخطيرة لـ .unwrap() عندما لا تكون متأكداً من أن Option يحتوي على قيمة.

ورقة مرجعية

تستخرج الطريقة .unwrap() القيمة من Option<T>:

let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number); // يطبع: The number is: 42

تحذير: استدعاء .unwrap() على None سيؤدي إلى توقف برنامجك بشكل مفاجئ (panic) وانهياره:

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // سيحدث panic هنا!

استخدم .unwrap() فقط عندما تكون متأكداً تماماً من أن Option يحتوي على قيمة Some.

جرّب بنفسك

use std::io;

fn main() {
    // قراءة المدخل الأول (الرقم كسلسلة نصية)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // قراءة المدخل الثاني (صالح أو غير صالح)
    let mut validity_input = String::new();
    io::stdin().read_line(&mut validity_input).expect("Failed to read line");
    let validity_input = validity_input.trim();
    
    // تحليل الرقم
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // TODO: اكتب كودك أدناه
    // بناءً على validity_input Option<i32> قم بإنشاء
    // Some(parsed_number) فقم بتعيين ،"valid" هي validity_input إذا كانت
    // None فقم بتعيين ،"invalid" هي validity_input إذا كانت
    // لاستخراج القيمة وطباعتها بالتنسيق التالي: Value: [number] .unwrap() ثم استخدم
    
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow