जवाबों:
जब आप तारों को समतल करते हैं, तो आपको परिणाम को संग्रहीत करने के लिए मेमोरी आवंटित करने की आवश्यकता होती है। के साथ शुरू करने के लिए सबसे आसान है String
और &str
:
fn main() {
let mut owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
owned_string.push_str(borrowed_string);
println!("{}", owned_string);
}
यहां, हमारे पास एक स्वामित्व स्ट्रिंग है जिसे हम म्यूट कर सकते हैं। यह कुशल है क्योंकि यह संभवतः हमें मेमोरी आवंटन का पुन: उपयोग करने की अनुमति देता है। वहाँ के लिए एक समान मामला है, String
और String
के रूप में &String
dereferenced जा सकता है&str
।
fn main() {
let mut owned_string: String = "hello ".to_owned();
let another_owned_string: String = "world".to_owned();
owned_string.push_str(&another_owned_string);
println!("{}", owned_string);
}
इसके बाद, another_owned_string
अछूता है (नोट नो mut
क्वालीफायर)। एक और वैरिएंट है जो खपत करता है , String
लेकिन इसके लिए म्यूट होने की आवश्यकता नहीं है। यह एक है के कार्यान्वयन Add
विशेषता है कि एक लेता है String
और बाएं हाथ की ओर के रूप में एक &str
दाएँ हाथ की ओर के रूप में:
fn main() {
let owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
let new_owned_string = owned_string + borrowed_string;
println!("{}", new_owned_string);
}
ध्यान दें कि owned_string
कॉल के बाद अब पहुँच योग्य नहीं है +
।
क्या होगा यदि हम दोनों अछूते छोड़कर एक नई स्ट्रिंग का उत्पादन करना चाहते हैं? उपयोग करने का सबसे सरल तरीका है format!
:
fn main() {
let borrowed_string: &str = "hello ";
let another_borrowed_string: &str = "world";
let together = format!("{}{}", borrowed_string, another_borrowed_string);
println!("{}", together);
}
ध्यान दें कि दोनों इनपुट चर अपरिवर्तनीय हैं, इसलिए हम जानते हैं कि उन्हें छुआ नहीं गया है। यदि हम किसी भी संयोजन के लिए एक ही काम करना चाहते हैं String
, तो हम इस तथ्य का उपयोग कर सकते हैं कि String
प्रारूपित भी किया जा सकता है:
fn main() {
let owned_string: String = "hello ".to_owned();
let another_owned_string: String = "world".to_owned();
let together = format!("{}{}", owned_string, another_owned_string);
println!("{}", together);
}
हालांकि आपको इसका उपयोग नहीं करना है format!
। आप एक स्ट्रिंग को क्लोन कर सकते हैं और दूसरे स्ट्रिंग को नए स्ट्रिंग में जोड़ सकते हैं :
fn main() {
let owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
let together = owned_string.clone() + borrowed_string;
println!("{}", together);
}
नोट - मेरे द्वारा किए गए सभी प्रकार के विनिर्देश निरर्थक हैं - संकलक यहां सभी प्रकार के नाटक कर सकता है। मैंने उन्हें केवल रस्ट में नए लोगों के लिए स्पष्ट होने के लिए जोड़ा, क्योंकि मुझे उम्मीद है कि यह प्रश्न उस समूह के साथ लोकप्रिय होगा!
Add
/ +
प्रतीक के बारे में क्या सोचते हैं ? आप चाहें तो इसे कवर कर सकते हैं।
.to_owned()
और .to_string()
उपरोक्त टिप्पणी के बाद से तय किया गया है ताकि विशेषज्ञता को निहित किया जा सके । वे दोनों अब एक ही प्रदर्शन है जब एक पर बुलाया &str
। प्रासंगिक प्रतिबद्धता: github.com/rust-lang/rust/pull/32586/files
एक तार में कई तारों को समेटने के लिए, दूसरे वर्ण द्वारा अलग किए गए, कुछ तरीके हैं।
मेरे द्वारा देखा गया सबसे अच्छा join
तरीका सरणी पर विधि का उपयोग कर रहा है :
fn main() {
let a = "Hello";
let b = "world";
let result = [a, b].join("\n");
print!("{}", result);
}
आपके उपयोग के मामले के आधार पर आप अधिक नियंत्रण भी पसंद कर सकते हैं:
fn main() {
let a = "Hello";
let b = "world";
let result = format!("{}\n{}", a, b);
print!("{}", result);
}
कुछ और मैनुअल तरीके हैं जो मैंने देखे हैं, कुछ यहां और वहां एक या दो आवंटन से बचते हैं। पठनीयता उद्देश्यों के लिए मुझे उपरोक्त दोनों पर्याप्त हैं।
join
वास्तव में SliceContactExt
विशेषता से जुड़ा हुआ है । लक्षण को अस्थिर रूप में चिह्नित किया गया है, लेकिन इसके तरीके स्थिर हैं और प्रस्तावना में शामिल हैं, इसलिए वे डिफ़ॉल्ट रूप से हर जगह उपयोग करने योग्य हैं। टीम अच्छी तरह से जानती है कि इस विशेषता का अस्तित्व नहीं है और मुझे लगता है कि भविष्य में इसके साथ चीजें बदल जाएंगी।
मुझे लगता है कि concat
विधि और +
यहाँ भी उल्लेख किया जाना चाहिए:
assert_eq!(
("My".to_owned() + " " + "string"),
["My", " ", "string"].concat()
);
और concat!
मैक्रो भी है लेकिन केवल शाब्दिक के लिए:
let s = concat!("test", 10, 'b', true);
assert_eq!(s, "test10btrue");
+
मौजूदा उत्तर में पहले ही उल्लेख किया गया है । ( इस के एक कार्यान्वयन है Add
ऐसी विशेषता है जो लेता है एक String
बाएं ओर है और एक के रूप में &str
दाएँ हाथ की ओर के रूप में: )
RUST को सुगम बनाने के लिए RUST में विभिन्न विधियाँ उपलब्ध हैं
concat!()
):fn main() {
println!("{}", concat!("a", "b"))
}
उपरोक्त कोड का आउटपुट है:
अब
push_str()
और +
ऑपरेटर):fn main() {
let mut _a = "a".to_string();
let _b = "b".to_string();
let _c = "c".to_string();
_a.push_str(&_b);
println!("{}", _a);
println!("{}", _a + &_b);
}
उपरोक्त कोड का आउटपुट है:
अब
एबीसी
Using format!()
):fn main() {
let mut _a = "a".to_string();
let _b = "b".to_string();
let _c = format!("{}{}", _a, _b);
println!("{}", _c);
}
उपरोक्त कोड का आउटपुट है:
अब
इसे देखें और जंग खेलने के मैदान के साथ प्रयोग करें
str
और&str
कर रहे हैं विभिन्न प्रकार के और समय के 99% के लिए, आप केवल के बारे में ध्यान देना चाहिए&str
। उनके बीच के अंतरों का विवरण देने वाले अन्य प्रश्न हैं।