Rust में मॉड्यूल: कोड को कई फ़ाइलों में विभाजित करना और पागल न होना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जब एक फ़ाइल बहुत छोटी पड़ जाए

\n\n

आप Rust में लिख रहे हैं। आपका प्रोजेक्ट बढ़ रहा है। कल ही main.rs में सब कुछ समा जाता था — फ़ंक्शन, स्ट्रक्चर, कुछ कॉन्फ़िग। और आज आप एक आवश्यक फ़ंक्शन को हज़ारों पंक्तियों के बीच खोजने में पाँच मिनट बिता रहे हैं। परिचित लगता है?

\n\n

देर-सबेर, हर Rust डेवलपर को कोड को तार्किक भागों में विभाजित करने की आवश्यकता होती है। लगता है, इससे आसान क्या हो सकता है? एक फ़ोल्डर बनाया, फ़ाइलें रखीं, इम्पोर्ट किया — और हो गया। लेकिन Rust की मॉड्यूल प्रणाली अपनी सख्ती के लिए जानी जाती है। mod.rs में एक गलत एंट्री — और कंपाइलर एक ऐसी त्रुटि देता है जिसे सुलझाने में आप आधा घंटा लगा देंगे।

\n\n

इस लेख में हम Rust मॉड्यूल को कई फ़ाइलों में विभाजित करते समय होने वाली शीर्ष त्रुटियों का विश्लेषण करेंगे और, सबसे महत्वपूर्ण, दिखाएंगे कि उनसे कैसे बचा जाए। आप सीखेंगे कि फ़ाइल संरचना को सही तरीके से कैसे व्यवस्थित करें, कब mod.rs का उपयोग करें, और कब lib.rs का, और क्यों pub use आपका सबसे अच्छा दोस्त है।

\n\n

Rust मॉड्यूल प्रणाली की संरचना

\n\n

त्रुटियों में गोता लगाने से पहले, आइए मूल बातें याद करें। Rust में, मॉड्यूल कोड को व्यवस्थित करने की एक इकाई है। डिफ़ॉल्ट रूप से, प्रत्येक फ़ाइल एक मॉड्यूल है, लेकिन यह इतना सीधा नहीं है।

\n\n

दो दृष्टिकोण हैं:

\n\n
    \n
  • समान नाम वाली फ़ाइल-मॉड्यूल: फ़ाइल utils.rs स्वचालित रूप से मॉड्यूल utils बन जाती है, यदि आप lib.rs या main.rs में mod utils; घोषित करते हैं।
  • \n
  • निर्देशिका-मॉड्यूल: अंदर mod.rs फ़ाइल वाला फ़ोल्डर utils/। इस मामले में, mod.rs मॉड्यूल का प्रवेश बिंदु है।
  • \n
\n\n

यह सरल लगता है, लेकिन यहीं पर अधिकांश समस्याएँ छिपी होती हैं। आइए सबसे सामान्य समस्याओं पर चर्चा करें।

\n\n

मॉड्यूल को कई फ़ाइलों में विभाजित करते समय शीर्ष-5 त्रुटियाँ

\n\n

त्रुटि #1: उप-मॉड्यूल घोषित करना भूल गए

\n\n

आपने फ़ाइल network/tcp.rs बनाई और इसका उपयोग करने का प्रयास कर रहे हैं। आप use network::tcp; लिखते हैं — और कंपाइलेशन त्रुटि मिलती है। क्यों? क्योंकि Rust स्वचालित रूप से फ़ोल्डरों को स्कैन नहीं करता है। आपको प्रत्येक उप-मॉड्यूल को स्पष्ट रूप से घोषित करना होगा।

\n\n
// network/mod.rs\n// ❌ त्रुटि: उप-मॉड्यूल tcp घोषित नहीं है\n// use network::tcp; // कंपाइल नहीं होगा\n\n// ✅ सही:\npub mod tcp; // उप-मॉड्यूल घोषित करें\n
\n\n

कैसे बचें: हमेशा जाँचें कि आपने पैरेंट मॉड्यूल में pub mod उपमॉड्यूल_नाम; जोड़ा है। यह स्पष्ट इम्पोर्ट जैसा है — Rust स्पष्टता चाहता है।

\n\n

त्रुटि #2: mod.rs और lib.rs के बीच भ्रम

\n\n

शुरुआती अक्सर mod.rs को प्रोजेक्ट की जड़ में, main.rs के बगल में रखते हैं। यह काम करता है, लेकिन केवल तभी जब आप एक लाइब्रेरी बना रहे हों। एक निष्पादन योग्य फ़ाइल (main.rs) के लिए, रूट मॉड्यूल स्वयं main.rs है। और mod.rs एक फ़ोल्डर के अंदर की फ़ाइल है।

\n\n
my_project/\n├── main.rs        // बाइनरी के लिए रूट मॉड्यूल\n├── lib.rs         // लाइब्रेरी के लिए रूट मॉड्यूल (यदि हो)\n├── utils/\n│   ├── mod.rs     // मॉड्यूल utils में प्रवेश बिंदु\n│   └── helpers.rs\n
\n\n

कैसे बचें: नियम याद रखें: mod.rs केवल मॉड्यूल-फ़ोल्डर के अंदर रहता है। यदि आपको लाइब्रेरी के लिए रूट मॉड्यूल चाहिए — lib.rs का उपयोग करें।

\n\n

त्रुटि #3: उप-मॉड्यूल में pub भूल गए

\n\n

आपने उप-मॉड्यूल घोषित किया, लेकिन फिर भी फ़ंक्शन को कॉल नहीं कर सकते। सबसे अधिक संभावना है, आप pub निर्दिष्ट करना भूल गए।

\n\n
// network/mod.rs\npub mod tcp;\n\n// network/tcp.rs\n// ❌ फ़ंक्शन डिफ़ॉल्ट रूप से निजी है\nfn connect() { /* ... */ }\n\n// ✅ इसे सार्वजनिक बनाएँ\npub fn connect() { /* ... */ }\n
\n\n

Rust में सब कुछ डिफ़ॉल्ट रूप से निजी है। यह बग नहीं, बल्कि एक विशेषता है: आप स्वयं तय करते हैं कि बाहरी दुनिया के लिए क्या खोलना है। यदि फ़ंक्शन मॉड्यूल के बाहर आवश्यक है — pub लगाएँ।

\n\n

कैसे बचें: pub का सोच-समझकर उपयोग करें। आंतरिक उपयोगिताओं के लिए निजी पहुँच रखें। API के लिए — सार्वजनिक बनाएँ।

\n\n

त्रुटि #4: अनदेखा करना

ब्लॉग

पुस्तक अनुशंसाएँ