2 回答
TA貢獻1851條經驗 獲得超3個贊
&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.
StringVec<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();
}}- 2 回答
- 0 關注
- 683 瀏覽
添加回答
舉報
