为什么不允许引用字符串(&String)、Vec(&Vec)或Box(&Box)作为函数参数?我编写了一些锈蚀代码&String作为论据:fn awesome_greeting(name: &String) {
println!("Wow, you are awesome, {}!", name);}我还编写了代码,其中引用了Vec或Box:fn total_price(prices: &Vec<i32>) -> i32 {
prices.iter().sum()}fn is_even(value: &Box<i32>) -> bool {
**value % 2 == 0}然而,我收到一些反馈说,这样做不是一个好主意。为什么不行?
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 关注
- 639 浏览
添加回答
举报
0/150
提交
取消