टीएल; डीआर: एक का उपयोग कर सकते हैं &str
, &[T]
या &T
अधिक सामान्य कोड के लिए अनुमति देने के लिए।
एक String
या एक Vec
का उपयोग करने के मुख्य कारणों में से एक है क्योंकि वे क्षमता बढ़ाने या कम करने की अनुमति देते हैं। हालांकि, जब आप एक अपरिवर्तनीय संदर्भ स्वीकार करते हैं, आप पर उन दिलचस्प तरीकों में से किसी का उपयोग नहीं कर सकते हैं Vec
या String
।
एक स्वीकारना &String
, &Vec
या &Box
भी आवश्यकता तर्क ढेर पर आवंटित किया इससे पहले कि आप समारोह कॉल कर सकते हैं। एक स्वीकारना &str
की अनुमति देता है एक स्ट्रिंग शाब्दिक (कार्यक्रम डेटा में बचाया) और एक को स्वीकार करने &[T]
या &T
एक ढेर-आवंटित सरणी या चर अनुमति देता है। अनावश्यक आवंटन एक प्रदर्शन हानि है। जब आप इन विधियों को परीक्षण या किसी main
विधि में कॉल करने का प्रयास करते हैं, तो यह आमतौर पर तुरंत सामने आ जाता है :
awesome_greeting(&String::from("Anna"));
total_price(&vec![42, 13, 1337])
is_even(&Box::new(42))
एक और प्रदर्शन पर विचार है &String
, &Vec
और &Box
अप्रत्यक्ष रूप से एक अनावश्यक परत का परिचय के रूप में आप &String
एक पाने के लिए String
और फिर अंत में खत्म करने के लिए एक दूसरे dereference प्रदर्शन है &str
।
इसके बजाय, आपको एक स्ट्रिंग स्लाइस ( &str
), एक स्लाइस ( &[T]
), या सिर्फ एक संदर्भ ( &T
) स्वीकार करना चाहिए । एक &String
, &Vec<T>
या &Box<T>
स्वचालित रूप से एक करने के लिए मजबूर हो जाएगा &str
, &[T]
या &T
क्रमशः।
fn awesome_greeting(name: &str) {
println!("Wow, you are awesome, {}!", name);
}
fn total_price(prices: &[i32]) -> i32 {
prices.iter().sum()
}
fn is_even(value: &i32) -> bool {
*value % 2 == 0
}
अब आप इन तरीकों को व्यापक प्रकार के सेट के साथ कह सकते हैं। उदाहरण के लिए, awesome_greeting
एक स्ट्रिंग शाब्दिक ( "Anna"
) या आवंटित के साथ कहा जा सकता है String
। total_price
एक सरणी ( &[1, 2, 3]
) या आवंटित के संदर्भ के साथ बुलाया जा सकता है Vec
।
आप जोड़ सकते हैं या से आइटम निकाल करना चाहते हैं तो String
या Vec<T>
, आप एक समय लग सकता है परिवर्तनशील संदर्भ ( &mut String
या &mut Vec<T>
):
fn add_greeting_target(greeting: &mut String) {
greeting.push_str("world!");
}
fn add_candy_prices(prices: &mut Vec<i32>) {
prices.push(5);
prices.push(25);
}
विशेष रूप से स्लाइस के लिए, आप भी स्वीकार कर सकते हैं &mut [T]
या &mut str
। यह आपको स्लाइस के अंदर एक विशिष्ट मूल्य को बदलने की अनुमति देता है, लेकिन आप स्लाइस के अंदर वस्तुओं की संख्या को बदल नहीं सकते हैं (जिसका अर्थ है कि यह स्ट्रिंग्स के लिए बहुत प्रतिबंधित है):
fn reset_first_price(prices: &mut [i32]) {
prices[0] = 0;
}
fn lowercase_first_ascii_character(s: &mut str) {
if let Some(f) = s.get_mut(0..1) {
f.make_ascii_lowercase();
}
}
&str
कम क्षमताओं के बिना (जैसे: में कम प्रतिबंध लगाता है) अधिक सामान्य है"? भी: बिंदु 3 अक्सर महत्वपूर्ण नहीं है जो मुझे लगता है। आमतौर परVec
s औरString
s स्टैक पर रहते हैं और अक्सर कहीं न कहीं वर्तमान स्टैक फ्रेम के पास भी होते हैं। स्टैक आमतौर पर गर्म होता है और एक सीपीयू कैश से डीरेफेरेंस परोसा जाएगा।