Rust में अक्षरों के ऐरे को लागू करने के दो तरीके हैं: str और String.
str, जिसे "स्ट्रिंग स्लाइस" भी कहते हैं, आमतौर पर रेफरेंस के साथ &str के रूप में इस्तेमाल किया जाता है।
इसका कारण जानने के लिए यह समझना मददगार होगा कि कोड की नीचे दी गई लाइन कंपाइल क्यों नहीं होगी
const MY_CONST: str = *"Hello, World!";
// the size for values of type `str` cannot be known at compilation time
// the trait `Sized` is not implemented for `str`
हालाँकि "Hello, World!" लिटरल की लंबाई कंपाइल समय पर ज्ञात की जा सकती है, फिर भी str के रूप में यह अज्ञात आकार का एक क्रम है।
लेकिन किसी लिटरल के रेफरेंस के रूप में (&str), इसमें एक "फैट पॉइंटर" होता है जो मेमोरी में उस लिटरल का पता और लंबाई रखता है।
फैट पॉइंटर का आकार ज्ञात होता है, इसलिए यह लाइन कंपाइल हो जाएगी
const MY_CONST: &str = "Hello, World!";
स्ट्रिंग स्लाइस के लिए बनाई गई परिवर्तनीय बाइंडिंग की वैल्यू बदली जा सकती है, पर उसे उसी जगह संशोधित नहीं किया जा सकता।
उदाहरण
let mut my_str = "Hello, World!";
my_str = "Hi!";
let mut my_string = String::from("Hello");
my_string.push_str(", World!"); // there is no equivalent function to modify &str
फंक्शन के लिए पैरामीटर तय करते समय &String की जगह &str इस्तेमाल करना कम बंधनकारी होता है, क्योंकि ऐसा करने पर नीचे दिया गया कोड कंपाइल नहीं होगा
pub fn main() {
let my_str: &str = "Hello, World!";
say_hi(my_str);
}
fn say_hi(phrase: &String) {
println!("{phrase:?}");
}
// mismatched types
// expected reference `&String`
// found reference `&str`
&str को &String में रूपांतरित नहीं किया जाएगा। लेकिन यह कोड कंपाइल होगा
pub fn main() {
let my_string = String::from("Hello, World!");
say_hi(&my_string)
}
fn say_hi(phrase: &str) {
println!("{phrase:?}");
}
&String को &str में रूपांतरित किया जा सकता है। इसलिए पैरामीटर का टाइप &str रखना अक्सर ज़्यादा उपयोगी होता है।