extern crate और use में अंतर: Rust में कहाँ अटकते हैं और कैसे बचें
\n\nअगर आपने Rust में कभी भी कोड लिखा है, तो आपने extern crate और use का सामना ज़रूर किया होगा। पहली नज़र में लगता है कि दोनों एक ही काम करते हैं — बाहरी कोड को जोड़ना। लेकिन असल में इनमें बड़ा अंतर है। यह सवाल Stack Overflow पर सबसे ज़्यादा पूछे जाने वाले सवालों में से एक है (हज़ारों व्यूज़!), और नए डेवलपर्स अक्सर इसमें उलझ जाते हैं। आइए एक बार और हमेशा के लिए समझ लें कि extern crate और use में क्या फर्क है, कहाँ क्या होता है, और आम गलतियों से कैसे बचें।
संक्षेप में: क्या है क्या
\n\nमान लीजिए कि आपका Rust प्रोजेक्ट एक बड़ा घर है। extern crate — यह निर्माण सामग्री को प्लॉट पर पहुँचाने जैसा है। आप कंपाइलर से कहते हैं: "अरे, यह ईंटों का डिब्बा (क्रेट) मैं इस्तेमाल करना चाहता हूँ, इसे लाओ।" इस कमांड के बिना कंपाइलर को बाहरी लाइब्रेरी के बारे में पता भी नहीं चलेगा।
use — यह घर के अंदर नेविगेशन है। आप कहते हैं: "मैं चाहता हूँ कि इस कमरे (मॉड्यूल) का दरवाज़ा सीधे रसोई (किसी विशेष टाइप या फंक्शन) तक जाए।" use पहले से ज्ञात मॉड्यूल और टाइप के लिए शॉर्टकट (एलियास) बनाता है, ताकि हर बार पूरा पथ न लिखना पड़े।
सीधे शब्दों में: extern crate जवाब देता है "हम क्या इस्तेमाल कर सकते हैं?" और use जवाब देता है "हम उस तक कैसे आसानी से पहुँचें?"
ऐतिहासिक संदर्भ: क्यों सब कन्फ्यूज़ होते हैं
\n\nयह कन्फ्यूज़न खाली नहीं है। Rust के पुराने वर्ज़न (2018 edition से पहले) में हर बाहरी क्रेट के लिए extern crate अनिवार्य था। यह ऐसा दिखता था:
// Rust 2015 — पुराना स्टाइल\nextern crate serde;\nuse serde::{Serialize, Deserialize};\n\nRust 2018 edition से शुरू करके, कंपाइलर Cargo.toml से डिपेंडेंसी खुद ढूँढ़ने लगा। अब ज़्यादातर क्रेट्स के लिए extern crate लिखना ज़रूरी नहीं है। बस Cargo.toml में डिपेंडेंसी जोड़ें और सीधे use का इस्तेमाल करें:
// Rust 2018+ — नया स्टाइल (extern crate अनिवार्य नहीं)\nuse serde::{Serialize, Deserialize};\n\nयहीं से नए डेवलपर्स के लिए मुश्किल शुरू होती है। वे पुराने उदाहरण देखते हैं जहाँ extern crate है, और नए उदाहरण जहाँ नहीं है, और समझ नहीं पाते कि कब इसकी ज़रूरत है। स्पॉयलर: ज़रूरत है, लेकिन बहुत कम मामलों में।
कब extern crate अभी भी ज़रूरी है (और यह महत्वपूर्ण है!)
\n\nतीन स्थितियाँ हैं जहाँ extern crate के बिना काम नहीं चलेगा:
- \n
#[link]के साथ सिस्टम लाइब्रेरी से जुड़ना — अगर आप C/C++ कोड के लिए बाइंडिंग लिख रहे हैं और#[link(name = "sqlite3")]एट्रीब्यूट का उपयोग कर रहे हैं, तोextern crateअनिवार्य है। \n - ग्लोबल मैक्रोज़ — कुछ क्रेट्स (जैसे
log) ऐसे मैक्रोज़ एक्सपोर्ट करते हैं जो पूरे प्रोग्राम में दिखने चाहिए। Rust 2018 में इसके लिएextern crate log;लिखना ज़रूरी है। \n - गैर-मानक क्रेट नामों के साथ बिल्ड करना — अगर आप
extern crate my_crate as foo;का उपयोग करके क्रेट का नाम बदलना चाहते हैं। \n
बाकी सभी मामलों में extern crate पुराने ज़माने की बात है। लेकिन कई डेवलपर्स आदत से इसे लिखते रहते हैं, और नए लोग पुराने ट्यूटोरियल से कोड कॉपी कर लेते हैं।
extern crate और use के साथ 5 सबसे आम गलतियाँ
\n\nगलती #1: जहाँ ज़रूरत न हो वहाँ extern crate का उपयोग
\n\nसबसे आम समस्या। आप Cargo.toml में क्रेट जोड़ते हैं, फिर extern crate rand; लिखते हैं — और कोड काम करता है। लेकिन यह एक अनावश्यक लाइन है। आधुनिक प्रोजेक्ट्स (Rust 2018+) में यह सिर्फ कोड को गंदा करती है और दूसरे डेवलपर्स को भ्रमित कर सकती है।
// बुरा (Rust 2018+ में अनावश्यक)