Avatar ·

ماذا يفعل عامل الاستفهام (?) في Rust وكيف يعمل مع الأخطاء؟

مرحبًا بالجميع! أنا مبتدئ في Rust وأحاول فهم معالجة الأخطاء. كثيرًا ما أرى في كود الآخرين عامل استفهام غريب — `?`. على سبيل المثال، هذا الكود: ```rust use std::fs::File; use std::io::Read; fn read_file(path: &str) -> Result { let mut file = File::open(path)?; let mut content = String::new(); file.read_to_string(&mut content)?; Ok(content) } ``` أفهم أن `File::open` يُرجع `Result`، لكن ماذا يفعل هذا `?` في نهاية السطر؟ بدونه، يشتكي المترجم من أنني لا أتعامل مع `Result`. لكن إذا أضفت `?`، يعمل الكود. حاولت قراءة التوثيق، لكنه مكتوب بشكل معقد. هل يمكنكم الشرح بكلمات بسيطة: ما هذه العلامة السحرية للاستفهام؟ هل لها علاقة بـ `unwrap()` أو `match`؟ لماذا تُرجع الدالة `Result`، لكن في الجسم يمكنني استخدام `?` دون كتابة match لكل استدعاء؟ مثال يربكني: إذا استبدلت `?` بـ `.unwrap()`، يعمل الكود أيضًا، لكن عند حدوث خطأ يتعطل البرنامج.