परिचय: Rust में स्ट्रिंग को आसानी से क्यों नहीं जोड़ा जा सकता?
\n\nअगर आप Python या JavaScript से Rust पर आए हैं, तो सबसे पहली चीज़ जो आपको चौंकाएगी, वह है "Hello, " + "world!" लिखने की कोशिश। कंपाइलर आपको लाल रेखा और एक रहस्यमय एरर मैसेज से स्वागत करता है। Python की दुनिया में यह तुरंत काम करता, लेकिन Rust एक अलग जानवर है। Stack Overflow पर "How do I concatenate strings?" सवाल ने लाखों व्यूज़ बटोरे हैं, और यह कोई संयोग नहीं है।
समस्या यह है कि Rust में स्ट्रिंग कॉन्केटनेशन सिर्फ सिंटैक्स शुगर नहीं है। यह मेमोरी मैनेजमेंट, ओनरशिप (ownership) और डेटा टाइप का सवाल है। अगर आप शुरुआती हैं, तो आप आसानी से क्लासिक गलतियाँ कर सकते हैं: स्ट्रिंग का ओनरशिप खोना, गलती से गीगाबाइट डेटा कॉपी करना, या बस String और &str में उलझ जाना।
इस लेख में हम 5 सबसे आम गलतियाँ देखेंगे जो शुरुआती Rust में स्ट्रिंग जोड़ते समय करते हैं, और बताएँगे कि उनसे कैसे बचें। आप जानेंगे कि कब + का उपयोग करें, कब format! का, और कब push_str का। चलिए शुरू करते हैं!
गलती #1: ओनरशिप (ownership) को भूल जाना
\n\nयह कैसा दिखता है
\n\nमान लीजिए आप यह कोड लिखते हैं:
\n\nlet s1 = String::from("नमस्ते");\nlet s2 = String::from(", दुनिया!");\nlet s3 = s1 + &s2; // गलती? या नहीं?\nprintln!("{}", s1); // कंपाइलेशन एरर!\n\nआप उम्मीद करते हैं कि s1 उपलब्ध रहेगा, लेकिन कंपाइलर कहता है: "नहीं, s1 को मूव (moved) कर दिया गया है।"
गलती का कारण
\n\nRust में स्ट्रिंग के लिए + ऑपरेटर सिग्नेचर fn add(self, s: &str) -> String का उपयोग करता है। self पर ध्यान दें — इसका मतलब है कि पहली स्ट्रिंग खपत (consumes) हो जाती है और आप इसे फिर से उपयोग नहीं कर सकते। आप सचमुच s1 को add फंक्शन को "दे" देते हैं, और यह अनुपलब्ध हो जाता है।
समाधान
\n\nदो तरीके हैं:
\n\n- \n
- स्ट्रिंग को क्लोन करें (अगर आपको मूल चाहिए):
let s3 = s1.clone() + &s2;\n - क्रम बदलें या
format!का उपयोग करें: \n
let s1 = String::from("नमस्ते");\nlet s2 = String::from(", दुनिया!");\nlet s3 = format!("{}{}", s1, s2); // s1 और s2 उपलब्ध रहते हैं\nprintln!("{}", s1); // काम करता है!\n\nसलाह: अगर आप कॉन्केटनेशन के बाद s1 का उपयोग नहीं करने वाले हैं, तो बेझिझक + का उपयोग करें। यह format! से तेज़ है, क्योंकि यह नया बफर स्क्रैच से नहीं बनाता।
गलती #2: String और &str में भ्रम
\n\nयह कैसा दिखता है
\n\nआप String को लिटरल से जोड़ने की कोशिश करते हैं:
let s = String::from("Hello");\nlet result = s + " world"; // काम करता है!\n\nलेकिन अगर आप उल्टा करने की कोशिश करते हैं:
\n\nlet s = "Hello";\nlet result = s + String::from(" world"); // एरर!\n\nगलती का कारण
\n\nऑपरेटर + तभी काम करता है जब बाईं ओर String हो और दाईं ओर &str हो। लिटरल " world" अपने आप &str है, इसलिए पहला उदाहरण काम करता है। दूसरे उदाहरण में s एक &str है, जिसके पास add मेथड नहीं है।
समाधान
\n\n&str को String में बदलें या format! का उपयोग करें:
let s = "Hello";\nlet result = format!("{} {}", s, "world"); // सार्वभौमिक तरीका\n// या\nlet result = s.to_string() + " world"; // to_string() एक String बनाता है\n\nसुनहरा नियम: String एक ओनिंग टाइप (owned) है, &str एक बॉरो (borrow) है। कॉन्केटनेशन के लिए हमेशा बाईं ओर ओनरशिप चाहिए।