فك تغليف الـ 'Option'
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 38 من 66.
أحياناً تحتاج إلى استخراج القيمة الفعلية من Option عندما تكون واثقاً من أنها تحتوي على Some. توفر Rust ميثود .unwrap() لهذا الغرض - فهي تأخذ القيمة من Some وتعطيك إياها مباشرة.
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);عندما تستدعي .unwrap() على Some(value)، فإنه يعيد القيمة الداخلية. في المثال أعلاه، يصبح actual_number هو 42 - ولم يعد مغلفاً بـ Option.
ومع ذلك، هناك تحذير بالغ الأهمية: إذا قمت باستدعاء .unwrap() على None، فسوف يتوقف برنامجك (panic) وينهار على الفور. وهذا يجعل .unwrap() طريقة خطيرة محتملة يجب استخدامها فقط عندما تكون متأكداً تماماً من أن Option يحتوي على Some.
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // سيؤدي هذا إلى حدوث panic!استخدم .unwrap() بشكل مقتصد وفقط في الحالات التي يمكنك فيها ضمان أن Option يحتوي على قيمة، كما هو الحال في الأمثلة البسيطة أو عندما تكون قد تحققت بالفعل باستخدام .is_some().
التحدي
سهلستتلقى مدخلين. المدخل الأول هو رقم (كسلسلة نصية)، والمدخل الثاني يشير إلى ما إذا كان يجب معاملة هذا الرقم كصالح (valid) أو غير صالح (invalid). إذا كان المدخل الثاني هو valid، فقم بإنشاء Option<i32> يحتوي على Some مع الرقم الذي تم تحويله. إذا كان المدخل الثاني هو invalid، فقم بإنشاء Option<i32> يحتوي على None. استخدم .unwrap() لاستخراج القيمة من Option وطباعتها.
المتطلبات:
- اقرأ المدخل الأول وقم بإزالة المسافات البيضاء (trim)
- اقرأ المدخل الثاني وقم بإزالة المسافات البيضاء (trim)
- قم بتحويل المدخل الأول إلى
i32باستخدام.parse::<i32>() - أنشئ متغير
Option<i32>:- إذا كان المدخل الثاني هو
valid، فقم بتعيينSome(parsed_number) - إذا كان المدخل الثاني هو
invalid، فقم بتعيينNone
- إذا كان المدخل الثاني هو
- استخدم
.unwrap()لاستخراج القيمة منOption - اطبع القيمة المستخرجة بالتنسيق التالي:
Value: [number]
المدخلات:
- السطر الأول: رقم في شكل سلسلة نصية (مثلاً،
42) - السطر الثاني: إما
validأوinvalid
المخرجات:
- إذا كان المدخل الثاني هو
valid:Value: [number] - إذا كان المدخل الثاني هو
invalid: سيحدث ذعر (panic) في البرنامج (هذا هو السلوك المتوقع لهذا التحدي)
ملاحظة: عندما يكون المدخل الثاني هو invalid، فإن استدعاء .unwrap() على None سيؤدي إلى حدوث panic. يوضح هذا الطبيعة الخطيرة لـ .unwrap() عندما لا تكون متأكداً من أن Option يحتوي على قيمة.
ورقة مرجعية
تستخرج الطريقة .unwrap() القيمة من Option<T>:
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number); // يطبع: The number is: 42تحذير: استدعاء .unwrap() على None سيؤدي إلى توقف برنامجك بشكل مفاجئ (panic) وانهياره:
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // سيحدث panic هنا!استخدم .unwrap() فقط عندما تكون متأكداً تماماً من أن Option يحتوي على قيمة Some.
جرّب بنفسك
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();
// قراءة المدخل الثاني (صالح أو غير صالح)
let mut validity_input = String::new();
io::stdin().read_line(&mut validity_input).expect("Failed to read line");
let validity_input = validity_input.trim();
// تحليل الرقم
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// TODO: اكتب كودك أدناه
// بناءً على validity_input Option<i32> قم بإنشاء
// Some(parsed_number) فقم بتعيين ،"valid" هي validity_input إذا كانت
// None فقم بتعيين ،"invalid" هي validity_input إذا كانت
// لاستخراج القيمة وطباعتها بالتنسيق التالي: Value: [number] .unwrap() ثم استخدم
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى