is_ok() و is_err()
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 44 من 66.
في بعض الأحيان تحتاج إلى التحقق بسرعة مما إذا كان Result يمثل نجاحاً أو فشلاً دون استخراج القيم الفعلية. توفر Rust طريقتين مريحتين لهذا الغرض: .is_ok() و .is_err().
تُرجع كلتا الطريقتين قيمة منطقية (boolean)، مما يجعلهما مثاليتين لعمليات التحقق الشرطية البسيطة. تُرجع الطريقة .is_ok() القيمة true إذا كان الـ Result هو Ok، والقيمة false إذا كان Err. تعمل الطريقة .is_err() بشكل عكسي:
let success: Result = Ok(42);
let failure: Result = Err("Something went wrong");
if success.is_ok() {
println!("Operation succeeded!");
}
if failure.is_err() {
println!("Operation failed!");
}هذه الطرق مفيدة بشكل خاص عندما تحتاج فقط إلى معرفة حالة النتيجة دون الاهتمام بالقيم المحددة بالداخل. وعلى عكس match، فهي لا تستهلك الـ Result، لذا لا يزال بإمكانك استخدامها بعد ذلك.
التحدي
سهلستتلقى مدخلين. المدخل الأول هو رقم (كسلسلة نصية)، والمدخل الثاني هو مؤشر حالة (success أو failure). قم بإنشاء Result<i32, &'static str> بناءً على الحالة. إذا كانت الحالة هي success، فقم بإنشاء Ok يحتوي على الرقم الذي تم تحليله. إذا كانت الحالة هي failure، فقم بإنشاء Err مع الرسالة "Operation failed". استخدم .is_ok() و .is_err() للتحقق من حالة النتيجة وطباعة الرسالة المناسبة.
المتطلبات:
- اقرأ المدخل الأول (الرقم) وقم بإزالة المسافات البيضاء (trim)
- قم بتحليل المدخل الأول إلى
i32 - اقرأ المدخل الثاني (الحالة) وقم بإزالة المسافات البيضاء (trim)
- قم بإنشاء متغير
Result<i32, &'static str>:- إذا كانت الحالة هي
success، فقم بتعيينOk(parsed_number) - إذا كانت الحالة هي
failure، فقم بتعيينErr("Operation failed")
- إذا كانت الحالة هي
- استخدم
.is_ok()للتحقق مما إذا كانت النتيجة ناجحة:- إذا كانت القيمة صحيحة، اطبع:
Success detected
- إذا كانت القيمة صحيحة، اطبع:
- استخدم
.is_err()للتحقق مما إذا كانت النتيجة خطأ:- إذا كانت القيمة صحيحة، اطبع:
Error detected
- إذا كانت القيمة صحيحة، اطبع:
المدخلات:
- السطر الأول: رقم (على سبيل المثال،
42) - السطر الثاني: إما
successأوfailure
المخرجات:
- إذا كانت الحالة هي
success:Success detected - إذا كانت الحالة هي
failure:Error detected
ورقة مرجعية
توفر لغة Rust طريقتين للتحقق من حالة Result دون استخراج قيمها:
.is_ok()- تُرجعtrueإذا كان الـResultهوOk، وfalseخلاف ذلك.is_err()- تُرجعtrueإذا كان الـResultهوErr، وfalseخلاف ذلك
let success: Result<i32, &str> = Ok(42);
let failure: Result<i32, &str> = Err("Something went wrong");
if success.is_ok() {
println!("Operation succeeded!");
}
if failure.is_err() {
println!("Operation failed!");
}هذه الطرق مفيدة لعمليات التحقق الشرطية البسيطة عندما تحتاج فقط إلى معرفة حالة النتيجة. وعلى عكس match، فهي لا تستهلك الـ Result، مما يسمح لك باستخدامها بعد ذلك.
جرّب بنفسك
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();
// تحويل الرقم إلى i32
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// قراءة المدخل الثاني (الحالة)
let mut status = String::new();
io::stdin().read_line(&mut status).expect("Failed to read line");
let status = status.trim();
// TODO: بناءً على الحالة Result<i32, &'static str> قم بإنشاء
// Ok(parsed_number) إذا كانت الحالة "success"، فقم بإنشاء
// Err("Operation failed") إذا كانت الحالة "failure"، فقم بإنشاء
// TODO: للتحقق من النتيجة وطباعة الرسالة المناسبة .is_err() و .is_ok() استخدم
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى