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

اختصارات: unwrap و expect

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

لقد تعلمت بالفعل عن .unwrap() و .expect() مع Option، وهذه الطرق نفسها تعمل مع Result أيضاً. ومع ذلك، فإن سلوكها يختلف قليلاً عند التعامل مع حالات النجاح والفشل.

تستخرج طريقة .unwrap() القيمة من متغير Ok، ولكن إذا كانت الـ Result هي Err، فسيحدث "panic" لبرنامجك ويتوقف عن العمل. وبالمثل، تقوم .expect() بنفس الشيء ولكنها تتيح لك تقديم رسالة "panic" مخصصة تجعل تصحيح الأخطاء أسهل:

let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // يطبع: Value: 42

// سيؤدي هذا إلى حدوث panic مع الرسالة المخصصة:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // يحدث Panic!

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

challenge icon

التحدي

سهل

ستتلقى مدخلين. المدخل الأول هو رقم (كسلسلة نصية)، والمدخل الثاني هو مؤشر حالة (ok أو error). قم بإنشاء Result<i32, &'static str> بناءً على الحالة. إذا كانت الحالة ok، فقم بإنشاء Ok يحتوي على الرقم الذي تم تحويله. إذا كانت الحالة error، فقم بإنشاء Err مع الرسالة "Invalid operation". استخدم .expect() مع رسالة مخصصة لاستخراج القيمة من Result وطباعتها.

المتطلبات:

  • اقرأ المدخل الأول (الرقم) وقم بإزالة المسافات البيضاء
  • قم بتحويل المدخل الأول إلى i32
  • اقرأ المدخل الثاني (الحالة) وقم بإزالة المسافات البيضاء
  • أنشئ متغير Result<i32, &'static str>:
    • إذا كانت الحالة ok، فقم بتعيين Ok(parsed_number)
    • إذا كانت الحالة error، فقم بتعيين Err("Invalid operation")
  • استخدم .expect("Failed to get value") لاستخراج القيمة من Result
  • اطبع القيمة المستخرجة بالتنسيق التالي: Value: [value]

المدخلات:

  • السطر الأول: رقم (على سبيل المثال، 75)
  • السطر الثاني: إما ok أو error

المخرجات:

  • إذا كانت الحالة ok: Value: [number]
  • إذا كانت الحالة error: سيحدث panic للبرنامج مع الرسالة المخصصة (غير مختبر في هذا التحدي)

ملاحظة: في هذا التحدي، ستستخدم حالات الاختبار الحالة ok فقط لضمان التنفيذ الناجح. حالة error ستتسبب في حدوث panic، وهو السلوك المتوقع لـ .expect() عند مواجهة Err.

ورقة مرجعية

تعمل الطرق .unwrap() و .expect() مع أنواع Result لاستخراج القيم من متغير Ok.

تقوم .unwrap() باستخراج القيمة من Ok، ولكنها تسبب حالة ذعر (panics) إذا كان الـ Result هو Err:

let success: Result<i32, &str> = Ok(42);
let value = success.unwrap();
println!("Value: {}", value); // يطبع: Value: 42

تعمل .expect() بنفس الطريقة ولكنها تتيح لك تقديم رسالة ذعر (panic message) مخصصة لتسهيل عملية تصحيح الأخطاء (debugging):

let success: Result<i32, &str> = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // يطبع: Value: 42

// سيؤدي هذا إلى حدوث ذعر (panic) مع الرسالة المخصصة:
let failure: Result<i32, &str> = Err("Something went wrong");
let value = failure.expect("This should work!"); // يحدث ذعر (panic) مع رسالة مخصصة

يجب استخدام هذه الطرق بحذر، لأنها ستؤدي إلى تعطل برنامجك إذا كان الـ Result هو Err. وهي الأنسب عندما تكون متأكداً من أن العملية ستنجح أو أثناء التطوير والاختبار.

جرّب بنفسك

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();
    
    // تحويل الرقم إلى i32
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // قراءة المدخل الثاني (الحالة)
    let mut status = String::new();
    io::stdin().read_line(&mut status).expect("Failed to read line");
    let status = status.trim();
    
    // TODO: اكتب كودك أدناه
    // بناءً على الحالة Result<i32, &'static str> أنشئ
    // لاستخراج القيمة .expect() استخدم
    // Value: [value] :اطبع النتيجة بالتنسيق التالي
    
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow