كيفية تضمين وحدة من ملف آخر في Rust: من مبتدئ إلى مستخدم واثق
\n\nهل سبق لك أن كتبت كودًا بلغة Rust وفجأة أدركت أن ملف main.rs الخاص بك يتحول إلى وحش عملاق مكون من 500 سطر؟ مألوف؟ أو ربما بدأت للتو في تعلم Rust وتريد فهم كيفية تنظيم الكود بشكل صحيح عن طريق تقسيمه إلى عدة ملفات. السؤال "How can I include a module from another file from the same project?" هو أحد أكثر الأسئلة شيوعًا على Stack Overflow، وليس بدون سبب. نظام الوحدات في Rust قوي في نفس الوقت... وغير واضح بعض الشيء للمبتدئين.
في هذه المقالة، سنشرح كل شيء من الألف إلى الياء: كيفية إنشاء وحدة، كيفية تضمينها، وما هي المخاطر الخفية وكيفية تجنب الأخطاء. هيا بنا!
\n\nلماذا الوحدات في Rust ليست مجرد "include"؟
\n\nإذا كنت قادمًا من Python أو JavaScript، فأنت معتاد على import أو require. في Rust، الأمر مختلف قليلاً. لا يوجد "التقط الملف واستخدمه" بطريقة سحرية. بدلاً من ذلك، يستخدم Rust نظام وحدات تصريحيًا. يجب أن تخبر المترجم بوضوح: "مرحبًا، هذا الملف هو جزء من مشروعي، وهذا هو اسمه".
القاعدة الأساسية التي يجب تذكرها هي: كل ملف هو وحدة، ولكن ليست كل وحدة هي ملف. يبدو وكأنه لغز، أليس كذلك؟ سنوضح ذلك الآن.
\n\nهيكل المشروع: من أين نبدأ
\n\nلنفترض أن لديك مشروعًا بهذا الهيكل:
\n\nmy_project/\n├── Cargo.toml\n├── src/\n│ ├── main.rs\n│ ├── greetings.rs\n│ └── utils/\n│ ├── mod.rs\n│ └── helpers.rs\n\nهنا، greetings.rs هو وحدة بسيطة، و utils/ هو مجلد يحتوي على وحدة. دعنا نتعلم كيفية تضمينها.
الطريقة 1: تضمين ملف وحدة بسيط
\n\nالحالة الأساسية. لديك greetings.rs مع دالة:
// greetings.rs\npub fn say_hello() {\n println!("مرحبًا من وحدة greetings!");\n}\n\nلاستخدام هذه الوحدة في main.rs، عليك القيام بأمرين:
- \n
- الإعلان عن الوحدة باستخدام الكلمة المفتاحية
mod\n - استيراد العناصر المطلوبة باستخدام
use\n
// main.rs\nmod greetings; // الإعلان عن الوحدة\n\nuse greetings::say_hello; // استيراد الدالة\n\nfn main() {\n say_hello(); // الاستخدام\n}\n\nهذا كل شيء! يبحث Rust تلقائيًا عن ملف greetings.rs في نفس المجلد الذي يوجد به main.rs. إذا تم العثور على الملف، يتم تضمين الوحدة.
مهم: الدالة say_hello مُعلَّمة بـ pub. إذا نسيت pub، سيخبرك المترجم أن الدالة خاصة وغير متاحة من الخارج. هذا أحد أكثر الأخطاء شيوعًا بين المبتدئين.
الطريقة 2: وحدة في مجلد (mod.rs أو lib.rs)
\n\nعندما ينمو مشروعك، من المناسب تجميع الوحدات في مجلدات. لهذا، يتم استخدام ملف mod.rs داخل المجلد. يعمل كنقطة دخول للوحدة.
لننشئ مجلد utils/ وبداخله mod.rs:
// utils/mod.rs\npub mod helpers; // الإعلان عن وحدة فرعية\n\nالآن لننشئ helpers.rs:
// utils/helpers.rs\npub fn do_something() {\n println!("نقوم بشيء مفيد");\n}\n\nفي main.rs نقوم بالتضمين كالتالي:
// main.rs\nmod utils; // الإعلان عن وحدة utils (يبحث عن utils/mod.rs)\n\nuse utils::helpers::do_something;\n\nfn main() {\n do_something();\n}\n\nلاحظ: mod utils; يخبر Rust بالبحث عن utils/mod.rs أو utils.rs. إذا وجد mod.rs - ممتاز، إذا وجد utils.rs - سيعمل أيضًا. لكن لا يمكن وجود كلا الملفين في نفس الوقت - سيصاب المترجم بالارتباك.