استخدام 'match' مع 'Result'
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 43 من 66.
الآن بعد أن فهمت ما هو الـ Result، دعنا نتعلم الطريقة الأكثر صراحة وقوة للتعامل مع حالتي النجاح والفشل: باستخدام تعبير match.
تماماً كما هو الحال مع Option، فإن match تجبرك على التعامل مع كلا المتغيرين لـ Result. تقوم بإنشاء ذراع لـ Ok للتعامل مع النجاح، وذراع أخرى لـ Err للتعامل مع الفشل:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}عندما يكون الـ Result هو Ok، يقوم الـ match باستخراج القيمة الناجحة وينفذ الذراع الأول. وعندما يكون Err، فإنه يستخرج معلومات الخطأ وينفذ الذراع الثاني. يضمن هذا النمط عدم تجاهل أي خطأ محتمل عن طريق الخطأ.
التحدي
سهلستتلقى مدخلين. المدخل الأول هو رقم (كسلسلة نصية)، والمدخل الثاني هو رقم آخر (كسلسلة نصية). قم بإنشاء دالة تحاول قسمة الرقم الأول على الرقم الثاني وتعيد Result<f64, &'static str>. إذا كان الرقم الثاني صفراً، فقم بإرجاع Err مع الرسالة "Division by zero". بخلاف ذلك، قم بإرجاع Ok مع نتيجة القسمة. استخدم تعبير match للتعامل مع حالتي Ok و Err وطباعة الرسالة المناسبة.
المتطلبات:
- اقرأ المدخل الأول (المقسوم) وقم بإزالة المسافات البيضاء
- قم بتحويل المدخل الأول إلى
f64 - اقرأ المدخل الثاني (المقسوم عليه) وقم بإزالة المسافات البيضاء
- قم بتحويل المدخل الثاني إلى
f64 - قم بإنشاء دالة تأخذ معاملين من نوع
f64وتعيدResult<f64, &'static str> - داخل الدالة، تحقق مما إذا كان المقسوم عليه هو
0.0:- إذا كان نعم، فقم بإرجاع
Err("Division by zero") - إذا كان لا، فقم بإرجاع
Ok(dividend / divisor)
- إذا كان نعم، فقم بإرجاع
- استدعِ الدالة مع الرقمين اللذين تم تحويلهما
- استخدم تعبير
matchللتعامل مع الـResult - في فرع
Ok(value)، اطبع:Result: [value] - في فرع
Err(error)، اطبع:Error: [error]
المدخلات:
- السطر الأول: رقم يمثل المقسوم (مثلاً،
10.0) - السطر الثاني: رقم يمثل المقسوم عليه (مثلاً،
2.0)
المخرجات:
- إذا كانت القسمة ناجحة:
Result: [result] - إذا كانت القسمة على صفر:
Error: Division by zero
ورقة مرجعية
استخدم match للتعامل مع كل من متغيري Ok و Err لـ Result:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}يجبرك تعبير match على التعامل مع كل من حالتي النجاح والفشل. عندما يكون الـ Result هو Ok، فإنه يستخرج القيمة الناجحة وينفذ الذراع الأول. وعندما يكون Err، فإنه يستخرج معلومات الخطأ وينفذ الذراع الثاني.
جرّب بنفسك
use std::io;
// TODO: أنشئ دالة القسمة الخاصة بك هنا والتي تعيد Result<f64, &'static str>
fn main() {
// قراءة المدخل الأول (المقسوم)
let mut dividend_input = String::new();
io::stdin().read_line(&mut dividend_input).expect("Failed to read line");
let dividend: f64 = dividend_input.trim().parse().expect("Invalid number");
// قراءة المدخل الثاني (المقسوم عليه)
let mut divisor_input = String::new();
io::stdin().read_line(&mut divisor_input).expect("Failed to read line");
let divisor: f64 = divisor_input.trim().parse().expect("Invalid number");
// TODO: استدعِ دالة القسمة الخاصة بك واستخدم match للتعامل مع Result
// اطبع "Result: [value]" في حالة Ok
// اطبع "Error: [error]" في حالة Err
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى