Rust / الأساسي / الدرس 1
Cargo والإصدارات وبنية البرنامج
ابنِ حزمة Rust قابلة للتكرار، وافصل مسؤوليات المترجم ومدير الحزم، واقرأ إخراج البرنامج منفصلًا عن تشخيص البناء.
في هذه الصفحة
أهداف الدرس
- تحديد الحزمة ووحدة crate وملف البيان ونقطة بداية التنفيذ.
- اختيار إصدار اللغة 2024 صراحة وشرح متطلب أدواته.
- ترجمة أمثلة مكتملة دون اعتماديات خارجية.
إصدار اللغة ليس إصدار المترجم
يفترض المقرر Rust مستقرة 1.85 أو أحدث وإصدار اللغة 2024. أتيح هذا الإصدار أول مرة في Rust 1.85، وتستطيع المترجمات الأحدث ترجمة إصدارات اللغة الأقدم. يختار إصدار اللغة قواعد التوافق، بينما يحدد إصدار المترجم الميزات وواجهات المكتبة المتاحة. اذكر الاثنين في المشروع بدل افتراض أن تاريخ المجلد يختارهما. تستخدم الأمثلة المكتبة القياسية فقط وميزات متاحة عند هذا الحد. والحزمة التي تستخدم واجهات أحدث يجب أن ترفع الحد الأدنى المدعوم وتفحصه منفصلًا.
Cargo يربط الملفات بأهداف البناء
يدير Cargo الحزم والاعتماديات وأوامر البناء. للحزمة ملف Cargo.toml وقد تحتوي وحدات crate للمكتبات والبرامج. تمثل crate وحدة ترجمة، ويعرّف src/main.rs عادة برنامجًا افتراضيًا وsrc/lib.rs مكتبة. يسجل البيان بيانات الحزمة وإصدار اللغة والاعتماديات. يفحص cargo check الشيفرة دون إنتاج الملف التنفيذي النهائي، ويبنيه cargo build، ويبني cargo run البرنامج المختار ثم يشغله. افصل فشل البناء عن إخراج ملف سابق كي لا تبدو الآثار القديمة إصلاحًا ناجحًا.
نقطة بداية مكتملة
يبدأ البرنامج عادة بالدالة fn main. تمثل println! ماكرو، كما توضح علامة التعجب، ينسق رسالة ويضيف سطرًا جديدًا. تحدد الأقواس جسم الدالة وتنهي الفاصلة المنقوطة العبارات. احفظ المثالين منفصلين فكلاهما يعرّف main. لا يحتاج الأول إلى إدخال أو ملفات أو شبكة أو حزم إضافية. يكتب سطرًا واحدًا على الإخراج القياسي، وتصدر التحذيرات إن وجدت في قناة تشخيص أخرى. يساعد توقع السطر قبل التنفيذ على فصل فهم المصدر عن مشاهدة الطرفية.
fn main() {
println!("Rust ready");
}
Rust ready
يكتب الماكرو النص وسطرًا جديدًا، ولا تدخل أوامر البناء في هذا الإخراج.
قراءة القيم عبر دالة صغيرة
تصرّح الدوال بأنواع المعاملات والإرجاع صراحة. يستطيع التعبير الأخير في كتلة تقديم قيمتها دون فاصلة منقوطة. تستقبل total قيمتي u32 وتعيد مجموعهما، وتتفادى القيم الصغيرة الفيض. تنسق main النتيجة بعنصر نائب. لملف مستقل يترجم rustc --edition=2024 main.rs وفق قواعد الإصدار الصريحة. وفي الحزمة ضع edition = "2024" وقيمة rust-version مناسبة في قسم package من Cargo.toml بدل الاعتماد على افتراضي تاريخي.
fn total(left: u32, right: u32) -> u32 { left + right }
fn main() {
println!("total={}", total(6, 9));
}
total=15
تعيد الكتلة خمسة عشر لأن تعبيرها الأخير بلا فاصلة منقوطة، ويضيف التنسيق تسمية للنتيجة.
حفظ الأوامر والأدلة
في مختبر دون اعتماديات خارجية يتجنب cargo build --offline وcargo test --offline جلب الحزم، لكنهما يحتاجان أدوات مثبتة. يجب تخزين الاعتماديات الموجودة مسبقًا للبناء دون اتصال. يسجل Cargo.lock إصدارات الاعتماديات المحلولة، ويمكن لإعداد الأدوات تثبيت اختيار المترجم. يساعد التنسيق والفحص في المراجعة ولا يثبتان صحة العمل. اقرأ أول تشخيص مناسب وأصلح سببه ثم أعد البناء وقارن السلوك بتوقع مكتوب. لا تثبت حزمًا اعتباطية لمشكلة يعزلها مثال قياسي صغير.
الأخطاء الشائعة وإصلاحها
رفض حزمة بإصدار لغة 2024.
- لماذا يحدث؟
- المترجم المختار أقدم من Rust 1.85.
- كيف تصلحه؟
- اختر أدوات مثبتة متوافقة وافحص إصدارها.
- كيف تتجنب تكراره؟
- سجّل إصدار اللغة والحد الأدنى للمترجم منفصلين.
نجاح cargo check دون ظهور برنامج تنفيذي.
- لماذا يحدث؟
- لم يطلب الفحص ملفًا تنفيذيًا نهائيًا.
- كيف تصلحه؟
- استخدم cargo build أو cargo run للهدف المطلوب.
- كيف تتجنب تكراره؟
- ميّز الفحص والبناء والتشغيل في التعليمات.
دالة تعيد الوحدة بدل القيمة.
- لماذا يحدث؟
- أسقطت فاصلة منقوطة قيمة التعبير الأخير.
- كيف تصلحه؟
- أزلها أو استخدم return صريحة.
- كيف تتجنب تكراره؟
- قارن قيمة الكتلة بنوع الإرجاع المصرح.
اختبر فهمك
1. غيّر total لتجمع اثني عشر وثمانية عشر. اذكر الإخراج كاملًا وهل ينفذ println! الجمع بنفسه.
اعرض الحل المشروح
استدع total(12, 18). يصبح السطر total=30 ثم سطرًا جديدًا. تحسب الدالة مجموع u32 قبل أن يستقبل التنسيق النتيجة. التسمية عرض وليست جزءًا من الحساب. أعد ترجمة المصدر ليعكس البرنامج الاستدعاء الجديد.
2. تعمل حزمة قياسية مع الاتصال ويفشل بناؤها دون اتصال قبل فحص المصدر. حدّد أول حقيقتين بيئيتين تفحصهما.
اعرض الحل المشروح
تحقق من تثبيت الأدوات المطلوبة ومن خلو الحزمة فعلًا من اعتماديات خارجية، بما فيها اعتماديات التطوير والبناء. لا يثبت الوضع غير المتصل مترجمًا مفقودًا ولا يجلب حزمًا غير مخزنة. احفظ الأمر والتشخيص كاملين قبل تعديل المصدر فقد يكون الفشل بيئيًا لا خطأ أنواع.
أهم ما تعلمته
- اختر إصدار لغة صريحًا وأدوات متوافقة.
- افصل بنية الحزمة عن إخراج البرنامج الملحوظ.
- استخدم مختبرات قياسية قابلة للتكرار قبل إضافة الاعتماديات.