الدالة '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) عامة، سترى رسالتك المخصصة، مما يجعل من السهل جداً فهم الخطأ الذي حدث ومكانه.
التحدي
سهلستتلقى مدخلين. المدخل الأول هو اسم المنتج، والمدخل الثاني يشير إلى ما إذا كان المنتج متوفراً في المخزون (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] :اطبع النتيجة بالتنسيق التالي
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى