&String我编写了一些以 a作为参数的Rust 代码:
&String
fn awesome_greeting(name: &String) { println!("Wow, you are awesome, {}!", name); }
Vec我还编写了接受对or 的引用的代码Box:
Vec
Box
fn total_price(prices: &Vec<i32>) -> i32 { prices.iter().sum() } fn is_even(value: &Box<i32>) -> bool { **value % 2 == 0 }
然而,我收到一些反馈说这样做不是一个好主意。为什么不?
在 Rust 中,通常不建议将函数参数的类型指定为 &String 或 &Vec<T>,而是应该使用 &str 或 &[T]。这是因为 String 和 Vec<T> 都是拥有所有权的类型,而 &str 和 &[T] 则是借用类型,不拥有所有权。
&Vec<T>
&str
&[T]
String
Vec<T>
使用 &String 和 &Vec<T> 会导致一些不必要的额外开销和限制:
不必要的所有权转移:将类型指定为 &String 或 &Vec<T> 会导致在函数调用时进行所有权转移,这可能会导致性能下降,并且可能不符合预期。因为函数参数的类型是借用类型,而不是拥有所有权的类型。
不够灵活:使用 &String 和 &Vec<T> 限制了函数的灵活性,因为它们只能接受特定类型的参数。而使用 &str 和 &[T] 则可以接受更广泛的类型,包括 String 和 Vec<T>,以及其他实现了相应 trait 的类型。
因此,通常建议在函数参数中使用 &str 和 &[T] 来表示字符串和数组的借用,这样可以提高代码的灵活性和性能。