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
.
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(); }}
- 2 回答
- 0 關注
- 672 瀏覽
添加回答
舉報