Result والمعامل ?
تمرير الأخطاء
Result والمعامل ? درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
النوع Result
يمثل Result<T, E> عملية يمكن أن تنجح باستخدام Ok(T) أو تفشل باستخدام Err(E). وهو نوع Rust الأساسي لمعالجة الأخطاء.
fn main() {
let parsed: Result<i32, _> = "42".parse::<i32>();
println!("{:?}", parsed);
}المطابقة على Result
يمكنكم معالجة النتيجتين صراحةً باستخدام match.
fn main() {
match "oops".parse::<i32>() {
Ok(n) => println!("got {n}"),
Err(e) => println!("error: {e}"),
}
}إرجاع Result
تعيد الدوال التي قد تفشل قيمة من نوع Result، مما يتيح للمتصل تحديد كيفية معالجة الأخطاء.
fn halve(n: i32) -> Result<i32, String> {
if n % 2 == 0 {
Ok(n / 2)
} else {
Err("odd number".to_string())
}
}
fn main() {
println!("{:?}", halve(10));
println!("{:?}", halve(7));
}العامل ?
يفك العامل ? تغليف قيمة Ok أو يعيد Err مبكرًا من الدالة. وهو يحل محل الشيفرة المطولة للمطابقة والإرجاع.
fn double_str(s: &str) -> Result<i32, std::num::ParseIntError> {
let n = s.parse::<i32>()?;
Ok(n * 2)
}
fn main() {
println!("{:?}", double_str("21"));
println!("{:?}", double_str("x"));
}التسلسل باستخدام ?
تُقرأ الخطوات المتعددة القابلة للفشل بوضوح عند تسلسلها باستخدام ?؛ إذ يوقف أول خطأ تنفيذ الخطوات المتبقية.
fn sum_two(a: &str, b: &str) -> Result<i32, std::num::ParseIntError> {
let x = a.parse::<i32>()?;
let y = b.parse::<i32>()?;
Ok(x + y)
}
fn main() {
println!("{:?}", sum_two("3", "4"));
}استخدام ? في main
يمكن لـ main إرجاع Result، ولذلك يعمل ? فيها أيضًا. ينهي Err المُعاد البرنامج برمز خروج غير صفري.
fn main() -> Result<(), std::num::ParseIntError> {
let n: i32 = "100".parse()?;
println!("parsed {n}");
Ok(())
}دوال Result المفيدة
دوال مساعدة مفيدة:
unwrap_or(default)— القيمة أو قيمة بديلةmap— تحويل قيمة Okmap_err— تحويل الخطأis_ok/is_err— التحقق من المتغير
fn main() {
let n = "x".parse::<i32>().unwrap_or(-1);
println!("{n}");
}التحويل من Option إلى Result
حوّلوا Option إلى Result باستخدام ok_or حتى يتمكن ? من نشر خطأ ذي معنى.
fn first_char(s: &str) -> Result<char, String> {
let c = s.chars().next().ok_or("empty string".to_string())?;
Ok(c)
}
fn main() {
println!("{:?}", first_char("hi"));
println!("{:?}", first_char(""));
}كيفية تحويل ? للأخطاء
عندما تختلف أنواع الأخطاء، يستدعي ? الدالة From::from لتحويل الخطأ إلى نوع الخطأ المعلن للدالة. وهذا يتيح معالجة الأخطاء بسهولة عبر الطبقات.
تجنب unwrap في بيئة الإنتاج
يتسبب unwrap وexpect في حدوث panic عند Err. وهما مناسبان للأمثلة والاختبارات، لكن يُفضّل استخدام ? أو المعالجة الصريحة في الشيفرة الفعلية حتى تظل حالات الفشل قابلة للاسترداد.
التسلسل باستخدام and_then
يشغل and_then الخطوة التالية القابلة للفشل فقط إذا نجحت الخطوة السابقة، ويمرر القيمة بينها.
fn main() {
let result = "8"
.parse::<i32>()
.and_then(|n| Ok(n * 2));
println!("{:?}", result);
}اختبار سريع
ماذا يفعل العامل ? عند تطبيقه على Result قيمته Err؟
مراجعة
لقد تعلمتم معالجة الأخطاء المستندة إلى Result:
- يمثل
Result<T, E>النجاح أو الفشل - يفك
?تغليف Ok أو يعيد Err مبكرًا - يعمل
?في الدوال وmainالتي تعيد Result - تساعد الدوال المركبة مثل
mapوmap_errوunwrap_orوok_or - تجنبوا
unwrapفي بيئة الإنتاج
الأسئلة الشائعة
هل درس «Result والمعامل ?» مجاني؟
نعم — نص درس «Result والمعامل ?» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
ماذا ستتعلم في «Result والمعامل ?»؟
تمرير الأخطاء تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «Result والمعامل ?»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Result والمعامل ?
- thiserror
- anyhow
- تحويل الأخطاء