Rust में String बनाम str: मुख्य अंतर उदाहरण सहित

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

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

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

Rust में String बनाम str: शुरुआती क्यों भ्रमित होते हैं और इसे हमेशा के लिए कैसे समझें

\n\n

यदि आप अभी Rust सीखना शुरू कर रहे हैं, तो आपने शायद पहले ही ऐसी स्थिति का सामना किया होगा: कंपाइलर त्रुटि देता है, आप String को वहाँ पास करने की कोशिश कर रहे हैं जहाँ &str की अपेक्षा है, या इसके विपरीत। परिचित लगता है? यह Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (हज़ारों बार देखा गया!), और यह व्यर्थ नहीं है — यह विषय Rust में मेमोरी प्रबंधन को समझने के लिए वास्तव में मौलिक है।

\n\n

इस लेख में, हम समझेंगे कि String और &str में क्या अंतर है, कब किस प्रकार का उपयोग करना है, और सामान्य गलतियों से कैसे बचें। चलिए शुरू करते हैं!

\n\n

जल्दी में उन लोगों के लिए संक्षिप्त उत्तर

\n\n

यदि आपको अभी चाहिए — मुख्य बात याद रखें:

\n\n
    \n
  • String — एक स्वामित्व वाला, परिवर्तनीय, गतिशील डेटा प्रकार है जो हीप (heap) में संग्रहीत होता है।
  • \n
  • &str — एक अपरिवर्तनीय स्ट्रिंग स्लाइस (slice) है, जो किसी और के स्वामित्व वाले डेटा को संदर्भित करता है। अक्सर &str के रूप में देखा जाता है।
  • \n
\n\n

अब गहराई में जाएँ।

\n\n

Rust में String क्या है?

\n\n

String एक प्रकार है जो अपने डेटा का स्वामित्व रखता है। जब आप String बनाते हैं, तो इसके लिए मेमोरी हीप में आवंटित की जाती है, और स्ट्रिंग बढ़, घट या बदल सकती है।

\n\n
let mut s = String::from("नमस्ते");\ns.push_str(", दुनिया!");\nprintln!("{}", s); // आउटपुट: नमस्ते, दुनिया!
\n\n

यहाँ s स्ट्रिंग का मालिक है। जब s दायरे से बाहर होता है, तो मेमोरी स्वचालित रूप से मुक्त हो जाती है (RAII — Resource Acquisition Is Initialization के लिए धन्यवाद)।

\n\n

String की मुख्य विशेषताएँ:

\n
    \n
  • डेटा का स्वामित्व (owning type)
  • \n
  • परिवर्तनीय (mutable)
  • \n
  • हीप में संग्रहीत
  • \n
  • स्ट्रिंग लिटरल से बनाया जा सकता है: String::from("पाठ")
  • \n
  • संयोजन, सम्मिलन, वर्ण हटाने का समर्थन करता है
  • \n
\n\n

Rust में &str क्या है?

\n\n

&str ("स्ट्र-स्लाइस" या "स्ट्रिंग-स्लाइस" के रूप में उच्चारित) — यह UTF-8 वर्णों के अनुक्रम का एक संदर्भ है, जो किसी और के स्वामित्व में है। &str स्वयं केवल डेटा और लंबाई का एक पॉइंटर है।

\n\n
let greeting: &str = "नमस्ते";\nprintln!("{}", greeting);
\n\n

इस उदाहरण में, greeting एक स्ट्रिंग लिटरल का संदर्भ है, जो सीधे प्रोग्राम की बाइनरी फ़ाइल (रीड-ओनली मेमोरी सेगमेंट) में संग्रहीत है। greeting इस डेटा का मालिक नहीं है — यह केवल इसे देखता है।

\n\n

&str की मुख्य विशेषताएँ:

\n
    \n
  • डेटा का स्वामित्व नहीं रखता (borrowed type)
  • \n
  • अपरिवर्तनीय (immutable)
  • \n
  • या तो बाइनरी (स्ट्रिंग लिटरल) या हीप (String से स्लाइस) में संग्रहीत
  • \n
  • हल्का — दो फ़ील्ड से बना: पॉइंटर + लंबाई (64-बिट सिस्टम पर 16 बाइट्स)
  • \n
  • फ़ंक्शन में पास करने के लिए आदर्श जब स्ट्रिंग को बदलने की आवश्यकता न हो
\n\n

String और &str के मुख्य अंतर (तालिका)

\n\n

आइए सब कुछ एक स्पष्ट तालिका में रखें:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
विशेषताString&str
स्वामित्वडेटा का स्वामित्व रखता हैडेटा उधार लेता है
परिवर्तनीयताहाँ (mut)नहीं
कहाँ संग्रहीतहीप (heap)हीप, स्टैक या बाइनरी
स्टैक में आकार24 बाइट्स (ptr + len + cap)16 बाइट्स (ptr + len)
निर्माणString::from("...")"..." या &s[..]
मुख्य उपयोगजब बदलने या स्वामित्व की आवश्यकता होजब केवल पढ़ने की आवश्यकता हो

ब्लॉग

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