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

توفير قيمة افتراضية: '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() لأن برنامجك لن يتوقف عن العمل أبداً - ستحصل دائماً على قيمة قابلة للاستخدام.

challenge icon

التحدي

سهل

ستتلقى مدخلين. المدخل الأول هو درجة (كعدد)، والمدخل الثاني يشير إلى ما إذا كانت الدرجة متاحة (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);
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow