كيفية تضمين وحدة من ملف آخر في Rust: دليل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية تضمين وحدة من ملف آخر في 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

في هذه المقالة، سنشرح كل شيء من الألف إلى الياء: كيفية إنشاء وحدة، كيفية تضمينها، وما هي المخاطر الخفية وكيفية تجنب الأخطاء. هيا بنا!

\n\n

لماذا الوحدات في Rust ليست مجرد "include"؟

\n\n

إذا كنت قادمًا من Python أو JavaScript، فأنت معتاد على import أو require. في Rust، الأمر مختلف قليلاً. لا يوجد "التقط الملف واستخدمه" بطريقة سحرية. بدلاً من ذلك، يستخدم Rust نظام وحدات تصريحيًا. يجب أن تخبر المترجم بوضوح: "مرحبًا، هذا الملف هو جزء من مشروعي، وهذا هو اسمه".

\n\n

القاعدة الأساسية التي يجب تذكرها هي: كل ملف هو وحدة، ولكن ليست كل وحدة هي ملف. يبدو وكأنه لغز، أليس كذلك؟ سنوضح ذلك الآن.

\n\n

هيكل المشروع: من أين نبدأ

\n\n

لنفترض أن لديك مشروعًا بهذا الهيكل:

\n\n
my_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/ هو مجلد يحتوي على وحدة. دعنا نتعلم كيفية تضمينها.

\n\n

الطريقة 1: تضمين ملف وحدة بسيط

\n\n

الحالة الأساسية. لديك greetings.rs مع دالة:

\n\n
// greetings.rs\npub fn say_hello() {\n    println!("مرحبًا من وحدة greetings!");\n}
\n\n

لاستخدام هذه الوحدة في main.rs، عليك القيام بأمرين:

\n\n
    \n
  1. الإعلان عن الوحدة باستخدام الكلمة المفتاحية mod
  2. \n
  3. استيراد العناصر المطلوبة باستخدام use
  4. \n
\n\n
// main.rs\nmod greetings; // الإعلان عن الوحدة\n\nuse greetings::say_hello; // استيراد الدالة\n\nfn main() {\n    say_hello(); // الاستخدام\n}
\n\n

هذا كل شيء! يبحث Rust تلقائيًا عن ملف greetings.rs في نفس المجلد الذي يوجد به main.rs. إذا تم العثور على الملف، يتم تضمين الوحدة.

\n\n

مهم: الدالة say_hello مُعلَّمة بـ pub. إذا نسيت pub، سيخبرك المترجم أن الدالة خاصة وغير متاحة من الخارج. هذا أحد أكثر الأخطاء شيوعًا بين المبتدئين.

\n\n

الطريقة 2: وحدة في مجلد (mod.rs أو lib.rs)

\n\n

عندما ينمو مشروعك، من المناسب تجميع الوحدات في مجلدات. لهذا، يتم استخدام ملف mod.rs داخل المجلد. يعمل كنقطة دخول للوحدة.

\n\n

لننشئ مجلد utils/ وبداخله mod.rs:

\n\n
// utils/mod.rs\npub mod helpers; // الإعلان عن وحدة فرعية
\n\n

الآن لننشئ helpers.rs:

\n\n
// utils/helpers.rs\npub fn do_something() {\n    println!("نقوم بشيء مفيد");\n}
\n\n

في main.rs نقوم بالتضمين كالتالي:

\n\n
// 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 - سيعمل أيضًا. لكن لا يمكن وجود كلا الملفين في نفس الوقت - سيصاب المترجم بالارتباك.

\n\n

الطريقة 3: النهج الحديث (Rust 201

المدونات

توصيات الكتب