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