Vec<char> को Rust में स्ट्रिंग में कैसे बदलें: पूर्ण गाइड

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

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

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

परिचय: यह विषय इतना लोकप्रिय क्यों है?

\n\n

यदि आपने कभी Rust में प्रोग्राम किया है, तो आपने निश्चित रूप से ऐसी स्थिति का सामना किया होगा जहाँ आपके पास Vec<char> है और आपको उससे एक सामान्य स्ट्रिंग String प्राप्त करनी है। Stack Overflow पर इस प्रश्न को हज़ारों बार देखा गया है और दर्जनों उत्तर मिले हैं - और यह कोई संयोग नहीं है।

\n\n

Rust में स्ट्रिंग्स के साथ काम करना एक अलग कला है। कई भाषाओं के विपरीत, जहाँ स्ट्रिंग्स केवल वर्णों की सरणियाँ होती हैं, यहाँ String (परिवर्तनीय, स्वामित्व वाली स्ट्रिंग) और &str (स्ट्रिंग स्लाइस का संदर्भ) होता है। और Vec<char> तो चार-बाइट Unicode वर्णों का एक वेक्टर है। इसलिए उन्हें Python या JavaScript की तरह बस "जोड़ना" संभव नहीं है।

\n\n

इस लेख में हम Vec<char> को String में बदलने के 4 कार्यशील तरीकों पर चर्चा करेंगे, प्रदर्शन, शुरुआती लोगों की सामान्य गलतियों पर बात करेंगे और तैयार कोड उदाहरण देंगे। चलिए शुरू करते हैं!

\n\n

1. सबसे आसान तरीका: iter().collect()

\n\n

यह विधि Rust की क्लासिक है। यदि आप पहले से ही इटरेटर से परिचित हैं, तो आप जानते हैं कि collect() लगभग किसी भी संग्रह को इकट्ठा कर सकता है। स्ट्रिंग के लिए यह इस प्रकार दिखता है:

\n\n
fn main() {\n    let chars: Vec<char> = vec!['प', '्', 'र', 'ि', 'व', 'े', 'ट'];\n    let s: String = chars.iter().collect();\n    println!("{}", s); // आउटपुट: प्रिवेट\n}
\n\n

यहाँ iter() वर्णों के संदर्भों (&char) पर एक इटरेटर लौटाता है, और collect() उन्हें String में इकट्ठा करता है। Rust कंपाइलर स्वचालित रूप से समझ जाता है कि String के लिए FromIterator ट्रेट को लागू करना है।

\n\n

महत्वपूर्ण: यदि आप chars.into_iter().collect() लिखते हैं, तो आपको वही परिणाम मिलेगा, लेकिन वेक्टर खपत (consumed) हो जाएगा। अपनी आवश्यकता के अनुसार विकल्प चुनें कि क्या आपको मूल वेक्टर की आगे आवश्यकता है।

\n\n

लाभ और हानियाँ

\n
    \n
  • ✅ न्यूनतम कोड, पढ़ने योग्य
  • \n
  • ✅ किसी भी वर्ण इटरेटर के साथ काम करता है
  • \n
  • ❌ विशेष विधियों की तुलना में थोड़ा धीमा (लेकिन 99% मामलों में अंतर नगण्य है)
  • \n
\n\n

2. String::from_iter() के माध्यम से संयोजन

\n\n

यह विधि मूलतः collect() के समान ही है, लेकिन स्पष्ट रूप में। कभी-कभी यह पठनीयता के लिए अधिक सुविधाजनक होता है:

\n\n
use std::iter::FromIterator;\n\nfn main() {\n    let chars: Vec<char> = vec!['R', 'u', 's', 't'];\n    let s = String::from_iter(chars);\n    println!("{}", s); // Rust\n}
\n\n

ध्यान दें: मैंने chars को सीधे पास किया, न कि chars.iter()। यह काम करता है क्योंकि Vec<char> IntoIterator को लागू करता है। यदि आपको वेक्टर को अछूता रखना है, तो String::from_iter(chars.iter()) का उपयोग करें।

\n\n

व्यक्तिगत रूप से, मैं इस विकल्प को पसंद करता हूँ जब कोड शुरुआती लोगों द्वारा पढ़ा जाता है - फ़ंक्शन का स्पष्ट नाम from_iter तुरंत समझ देता है कि क्या हो रहा है।

\n\n

3. push() के साथ मैन्युअल इटरेशन

\n\n

कभी-कभी अधिक नियंत्रण की आवश्यकता होती है। उदाहरण के लिए, आप एक उपसर्ग जोड़ना चाहते हैं या कुछ वर्णों को फ़िल्टर करना चाहते हैं। तब आप ऐसा कर सकते हैं:

\n\n
fn main() {\n    let chars: Vec<char> = vec!['H', 'e', 'l', 'l', 'o'];\n    let mut s = String::with_capacity(chars.len());\n    \n    for c in chars {\n        s.push(c);\n    }\n    \n    println!("{}", s); // Hello\n}
\n\n

मैंने String::with_capacity() का उपयोग किया ताकि पहले से मेमोरी आवंटित हो जाए - इससे काम तेज़ होता है, क्योंकि push() के दौरान अतिरिक्त पुनःआवंटन नहीं होगा।

\n\n

इसकी आवश्यकता कब होती है?

\n
    \n
  • जब आप स्ट्रिंग के साथ समानांतर में अन्य हेरफेर कर रहे हों
  • \n
  • जब आप विभाजक जोड़ना चाहते हैं या चलते-फिरते केस बदलना चाहते हैं
  • \n
  • सीखने के लिए - यह समझने के लिए कि स्ट्रिंग्स "हुड के नीचे" कैसे काम करती हैं
  • \n
\n\n

इस विधि का प्रदर्शन लगभग collect() के समान है, यदि आप

ब्लॉग

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