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

الدالة 'expect'

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

بينما يؤدي .unwrap() المهمة، إلا أن له عيباً رئيسياً: فعندما يتسبب في حدوث panic عند القيمة None، تكون رسالة الخطأ عامة وغير مفيدة. وهنا يأتي دور .expect() للمساعدة.

تعمل طريقة .expect() تماماً مثل .unwrap() - فهي تستخرج القيمة من Some وتتسبب في حدوث panic عند وجود None. الفرق الرئيسي هو أن .expect() تتيح لك تقديم رسالة panic مخصصة:

let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);

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

challenge icon

التحدي

سهل

ستتلقى مدخلين. المدخل الأول هو اسم المنتج، والمدخل الثاني يشير إلى ما إذا كان المنتج متوفراً في المخزون (yes) أو غير متوفر (no). قم بإنشاء Option<String> يحتوي على Some(product_name) إذا كان المنتج متوفراً، أو None إذا كان غير متوفر. استخدم .expect() مع رسالة وصفية لاستخراج اسم المنتج وطباعته.

المتطلبات:

  • اقرأ المدخل الأول (اسم المنتج) وقم بإزالة المسافات الزائدة (trim)
  • اقرأ المدخل الثاني (حالة المخزون) وقم بإزالة المسافات الزائدة (trim)
  • أنشئ متغيراً من نوع Option<String>:
    • إذا كانت حالة المخزون yes، قم بتعيين Some(product_name.to_string())
    • إذا كانت حالة المخزون no، قم بتعيين None
  • استخدم .expect() مع الرسالة "Product should be in stock" لاستخراج اسم المنتج
  • اطبع اسم المنتج المستخرج بالتنسيق التالي: Product available: [product_name]

المدخلات:

  • السطر الأول: اسم المنتج (مثلاً، Laptop)
  • السطر الثاني: إما yes أو no

المخرجات:

  • إذا كانت حالة المخزون yes: Product available: [product_name]
  • إذا كانت حالة المخزون no: سيحدث panic للبرنامج مع الرسالة المخصصة "Product should be in stock" (هذا هو السلوك المتوقع لهذا التحدي)

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

ورقة مرجعية

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

عند استدعائها على Option:

  • إذا كانت تحتوي على Some، فإنها تعيد القيمة الداخلية
  • إذا كانت تحتوي على None، فإنها تسبب ذعراً (panic) برسالتك المخصصة
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);

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

جرّب بنفسك

use std::io;

fn main() {
    // قراءة اسم المنتج
    let mut product_name = String::new();
    io::stdin().read_line(&mut product_name).expect("Failed to read line");
    let product_name = product_name.trim();
    
    // قراءة حالة المخزون
    let mut stock_status = String::new();
    io::stdin().read_line(&mut stock_status).expect("Failed to read line");
    let stock_status = stock_status.trim();
    
    // TODO: اكتب كودك أدناه
    // بناءً على stock_status Option<String> قم بإنشاء
    // لاستخراج اسم المنتج .expect() استخدم
    // Product available: [product_name] :اطبع النتيجة بالتنسيق التالي
    
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow