Rust في 2025: لماذا الآن تحديدًا؟
\n\nعلى مدى السنوات الثلاث الماضية، حقق Rust اختراقًا حقيقيًا. اللغة التي بدت في البداية "معقدة ومتخصصة"، تُستخدم اليوم في نواة Linux، وفي المتصفحات (Firefox، وجزئيًا Chromium)، وفي أدوات DevOps (ripgrep, fd, bat) وحتى في تطوير الويب. في عام 2025، Rust ليست مجرد "لغة أخرى"، بل الأداة رقم واحد لكتابة كود آمن وسريع وموثوق.
\n\nلكن هناك مشكلة واحدة: عتبة الدخول. تشتهر Rust بـ borrow checker الخاص بها، وأوقات الحياة (lifetimes)، ونظام الأنواع الصارم. العديد من المبتدئين يتوقفون عن التعلم في الأسبوع الثاني، بعد أن يصطدموا بأخطاء المترجم.
\n\nهذه المقالة هي خارطة طريق لتعلم Rust في عام 2025. لقد قمت بتفصيل ترتيب المواضيع، وأعطيت أمثلة كود حقيقية، وشرحت ما يجب تعلمه بالتأكيد، وما يمكن تركه لوقت لاحق. هيا بنا!
\n\nالمرحلة 1: الأساسيات (الأسبوعان 1–2)
\n\n1.1 التثبيت وأول برنامج
\n\nلنبدأ بالتثبيت عبر rustup — المثبت الرسمي. يدير إصدارات المترجم وسلسلة الأدوات.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nrustc --version\ncargo --version\n\nملفك الأول main.rs:
fn main() {\n println!("مرحبًا، عالم Rust 2025!");\n}\n\nنقوم بالتجميع: rustc main.rs && ./main. لكن من الأفضل التعود فورًا على Cargo — مدير الحزم وأداة البناء:
cargo new my_first_project\ncd my_first_project\ncargo run\n\n1.2 المتغيرات، الأنواع، هياكل التحكم
\n\nRust لغة شديدة الكتابة (strictly typed)، لكن المترجم غالبًا ما يستنتج الأنواع بنفسه. الفرق الرئيسي عن Python أو JavaScript هو أن المتغيرات غير قابلة للتغيير (immutable) افتراضيًا.
\n\nfn main() {\n let x = 5; // غير قابل للتغيير\n let mut y = 10; // قابل للتغيير\n y += 5;\n\n let name = "Rust";\n let year: u32 = 2025;\n\n if year > 2024 {\n println!("{} — المستقبل هنا بالفعل!", name);\n }\n\n for i in 0..5 {\n println!("العدد: {}", i);\n }\n}\n\n1.3 الملكية (Ownership) — حجر الزاوية
\n\nهذا هو ما يخيف المبتدئين أكثر من غيره. لكن بدون فهم ownership، لن تكتب أي مشروع حقيقي. الجوهر: لكل قيمة في Rust مالك واحد بالضبط. عندما يخرج المالك من النطاق، يتم تحرير الذاكرة.
\n\nfn main() {\n let s1 = String::from("hello");\n let s2 = s1; // تنتقل الملكية إلى s2\n\n // println!("{}", s1); // خطأ! s1 لم تعد تملك السلسلة\n println!("{}", s2); // صحيح\n}\n\nإذا كنت بحاجة لنقل البيانات دون فقدان الملكية، نستخدم مرجعًا (reference):
\n\nfn main() {\n let s = String::from("Rust");\n let len = calculate_length(&s); // نستعير\n println!("طول '{}' = {}", s, len); // s لا تزال متاحة\n}\n\nfn calculate_length(s: &String) -> usize {\n s.len()\n}\n\nالمرحلة 2: التعمق (الأسابيع 3–5)
\n\n2.1 الهياكل، التعدادات، ومطابقة الأنماط (pattern matching)
\n\nRust ليست لغة OOP بالمعنى الكلاسيكي، لكن الهياكل والسمات (traits) تغطي 90% من الاحتياجات.
\n\nstruct User {\n username: String,\n email: String,\n active: bool,\n}\n\nenum Status {\n Active,\n Inactive,\n Banned { reason: String },\n}\n\nfn check_status(status: Status) {\n match status {\n Status::Active => println!("المستخدم نشط"),\n Status::Inactive => println!("غير نشط"),\n Status::Banned { reason } => println!("محظور: {}", reason),\n }\n}\n\n2.2 معالجة الأخطاء: Option و Result
\n\nفي Rust لا توجد استثناءات (exceptions). بدلاً منها، لدينا Result<T, E> و Option<T> الأنيقتان. انسَ try/except — الآن تستخدم match أو ?