টিএল; ডিআর: পরিবর্তে কেউ ব্যবহার করতে পারে &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এবং তারপরে শেষ হওয়ার জন্য দ্বিতীয় সীমাবদ্ধতা সম্পাদন করতে হবে &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এস এবংStringএস স্ট্যাকের উপরে এবং প্রায়শই কোথাও কোথাও বর্তমান স্ট্যাক ফ্রেমের কাছাকাছি বাস করবে। স্ট্যাকটি সাধারণত উষ্ণ থাকে এবং সিপিইউ ক্যাশে থেকে ডিসেরফারেন্স পরিবেশিত হবে।