Rust में String बनाम str: शुरुआती क्यों भ्रमित होते हैं और इसे हमेशा के लिए कैसे समझें
\n\nयदि आप अभी Rust सीखना शुरू कर रहे हैं, तो आपने शायद पहले ही ऐसी स्थिति का सामना किया होगा: कंपाइलर त्रुटि देता है, आप String को वहाँ पास करने की कोशिश कर रहे हैं जहाँ &str की अपेक्षा है, या इसके विपरीत। परिचित लगता है? यह Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (हज़ारों बार देखा गया!), और यह व्यर्थ नहीं है — यह विषय Rust में मेमोरी प्रबंधन को समझने के लिए वास्तव में मौलिक है।
इस लेख में, हम समझेंगे कि String और &str में क्या अंतर है, कब किस प्रकार का उपयोग करना है, और सामान्य गलतियों से कैसे बचें। चलिए शुरू करते हैं!
जल्दी में उन लोगों के लिए संक्षिप्त उत्तर
\n\nयदि आपको अभी चाहिए — मुख्य बात याद रखें:
\n\n- \n
String— एक स्वामित्व वाला, परिवर्तनीय, गतिशील डेटा प्रकार है जो हीप (heap) में संग्रहीत होता है। \n&str— एक अपरिवर्तनीय स्ट्रिंग स्लाइस (slice) है, जो किसी और के स्वामित्व वाले डेटा को संदर्भित करता है। अक्सर&strके रूप में देखा जाता है। \n
अब गहराई में जाएँ।
\n\nRust में String क्या है?
\n\nString एक प्रकार है जो अपने डेटा का स्वामित्व रखता है। जब आप String बनाते हैं, तो इसके लिए मेमोरी हीप में आवंटित की जाती है, और स्ट्रिंग बढ़, घट या बदल सकती है।
let mut s = String::from("नमस्ते");\ns.push_str(", दुनिया!");\nprintln!("{}", s); // आउटपुट: नमस्ते, दुनिया!\n\nयहाँ s स्ट्रिंग का मालिक है। जब s दायरे से बाहर होता है, तो मेमोरी स्वचालित रूप से मुक्त हो जाती है (RAII — Resource Acquisition Is Initialization के लिए धन्यवाद)।
String की मुख्य विशेषताएँ:
\n- \n
- डेटा का स्वामित्व (owning type) \n
- परिवर्तनीय (mutable) \n
- हीप में संग्रहीत \n
- स्ट्रिंग लिटरल से बनाया जा सकता है:
String::from("पाठ")\n - संयोजन, सम्मिलन, वर्ण हटाने का समर्थन करता है \n
Rust में &str क्या है?
\n\n&str ("स्ट्र-स्लाइस" या "स्ट्रिंग-स्लाइस" के रूप में उच्चारित) — यह UTF-8 वर्णों के अनुक्रम का एक संदर्भ है, जो किसी और के स्वामित्व में है। &str स्वयं केवल डेटा और लंबाई का एक पॉइंटर है।
let greeting: &str = "नमस्ते";\nprintln!("{}", greeting);\n\nइस उदाहरण में, greeting एक स्ट्रिंग लिटरल का संदर्भ है, जो सीधे प्रोग्राम की बाइनरी फ़ाइल (रीड-ओनली मेमोरी सेगमेंट) में संग्रहीत है। greeting इस डेटा का मालिक नहीं है — यह केवल इसे देखता है।
&str की मुख्य विशेषताएँ:
\n- \n
- डेटा का स्वामित्व नहीं रखता (borrowed type) \n
- अपरिवर्तनीय (immutable) \n
- या तो बाइनरी (स्ट्रिंग लिटरल) या हीप (
Stringसे स्लाइस) में संग्रहीत \n - हल्का — दो फ़ील्ड से बना: पॉइंटर + लंबाई (64-बिट सिस्टम पर 16 बाइट्स) \n
- फ़ंक्शन में पास करने के लिए आदर्श जब स्ट्रिंग को बदलने की आवश्यकता न हो
String और &str के मुख्य अंतर (तालिका)
\n\nआइए सब कुछ एक स्पष्ट तालिका में रखें:
\n\n| विशेषता | \nString | \n&str | \n
|---|---|---|
| स्वामित्व | \nडेटा का स्वामित्व रखता है | \nडेटा उधार लेता है | \n
| परिवर्तनीयता | \nहाँ (mut) | \nनहीं | \n
| कहाँ संग्रहीत | \nहीप (heap) | \nहीप, स्टैक या बाइनरी | \n
| स्टैक में आकार | \n24 बाइट्स (ptr + len + cap) | \n16 बाइट्स (ptr + len) | \n
| निर्माण | \nString::from("...") | \n"..." या &s[..] | \n
| मुख्य उपयोग | \nजब बदलने या स्वामित्व की आवश्यकता हो | \nजब केवल पढ़ने की आवश्यकता हो |