توفير قيمة افتراضية: 'unwrap_or'
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 40 من 66.
بينما يمكن لـ .unwrap() و .expect() استخراج القيم من Option، إلا أن كليهما به عيب كبير: فهما يتسببان في حدوث panic عند مواجهة None. لكتابة كود أكثر أماناً، توفر Rust الدالة .unwrap_or() - وهي طريقة لا تتسبب أبداً في حدوث panic.
تأخذ الطريقة .unwrap_or() قيمة افتراضية كمعامل. إذا كان الـ Option يحتوي على Some، فإنها تعيد القيمة الداخلية. أما إذا كان None، فإنها تعيد القيمة الافتراضية التي قدمتها:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // يطبع: Score: 85
let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // يطبع: Score: 0هذا النهج أكثر أماناً بكثير من .unwrap() لأن برنامجك لن يتوقف عن العمل أبداً - ستحصل دائماً على قيمة قابلة للاستخدام.
التحدي
سهلستتلقى مدخلين. المدخل الأول هو درجة (كعدد)، والمدخل الثاني يشير إلى ما إذا كانت الدرجة متاحة (yes) أو مفقودة (no). قم بإنشاء Option<i32> بناءً على حالة التوفر. استخدم .unwrap_or() لاستخراج الدرجة بأمان مع قيمة افتراضية قدرها 50، ثم اطبع الدرجة النهائية.
المتطلبات:
- اقرأ المدخل الأول (الدرجة) وقم بإزالة المسافات البيضاء
- قم بتحويل المدخل الأول إلى
i32 - اقرأ المدخل الثاني (حالة التوفر) وقم بإزالة المسافات البيضاء
- أنشئ متغير
Option<i32>:- إذا كانت حالة التوفر هي
yes، فقم بتعيينSome(score) - إذا كانت حالة التوفر هي
no، فقم بتعيينNone
- إذا كانت حالة التوفر هي
- استخدم
.unwrap_or(50)لاستخراج الدرجة مع قيمة افتراضية قدرها50 - اطبع الدرجة النهائية بالتنسيق التالي:
Final score: [score]
المدخلات:
- السطر الأول: عدد يمثل الدرجة (مثلاً،
85) - السطر الثاني: إما
yesأوno
المخرجات:
- إذا كانت حالة التوفر هي
yes:Final score: [score](الدرجة الفعلية) - إذا كانت حالة التوفر هي
no:Final score: 50(القيمة الافتراضية)
ورقة مرجعية
توفر الطريقة .unwrap_or() طريقة آمنة لاستخراج القيم من Option دون حدوث panic. فهي تأخذ قيمة افتراضية كمعامل (argument) وتُرجع إما القيمة الداخلية إذا كانت Some، أو القيمة الافتراضية إذا كانت None:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
// score هي 85
let no_score: Option<i32> = None;
let default_score = no_score.unwrap_or(0);
// default_score هي 0هذه الطريقة أكثر أماناً من .unwrap() أو .expect() لأنها لا تتسبب أبداً في حدوث panic - فأنت تحصل دائماً على قيمة قابلة للاستخدام.
جرّب بنفسك
use std::io;
fn main() {
// قراءة الدرجة
let mut score_input = String::new();
io::stdin().read_line(&mut score_input).expect("Failed to read line");
let score: i32 = score_input.trim().parse().expect("Invalid number");
// قراءة حالة التوفر
let mut availability = String::new();
io::stdin().read_line(&mut availability).expect("Failed to read line");
let availability = availability.trim();
// TODO: اكتب الكود الخاص بك أدناه
// بناءً على حالة التوفر Option<i32> قم بإنشاء
// للحصول على الدرجة النهائية .unwrap_or(50) استخدم
// طباعة النتيجة
println!("Final score: {}", final_score);
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى