小能豆

为什么不鼓励接受引用 &String、&Vec 或 &Box 作为函数参数?

rust

&String我编写了一些以 a作为参数的Rust 代码:

fn awesome_greeting(name: &String) {
    println!("Wow, you are awesome, {}!", name);
}

Vec我还编写了接受对or 的引用的代码Box

fn total_price(prices: &Vec<i32>) -> i32 {
    prices.iter().sum()
}

fn is_even(value: &Box<i32>) -> bool {
    **value % 2 == 0
}

然而,我收到一些反馈说这样做不是一个好主意。为什么不?


阅读 109

收藏
2024-05-21

共1个答案

小能豆

在 Rust 中,通常不建议将函数参数的类型指定为 &String&Vec<T>,而是应该使用 &str&[T]。这是因为 StringVec<T> 都是拥有所有权的类型,而 &str&[T] 则是借用类型,不拥有所有权。

使用 &String&Vec<T> 会导致一些不必要的额外开销和限制:

  1. 不必要的所有权转移:将类型指定为 &String&Vec<T> 会导致在函数调用时进行所有权转移,这可能会导致性能下降,并且可能不符合预期。因为函数参数的类型是借用类型,而不是拥有所有权的类型。

  2. 不够灵活:使用 &String&Vec<T> 限制了函数的灵活性,因为它们只能接受特定类型的参数。而使用 &str&[T] 则可以接受更广泛的类型,包括 StringVec<T>,以及其他实现了相应 trait 的类型。

因此,通常建议在函数参数中使用 &str&[T] 来表示字符串和数组的借用,这样可以提高代码的灵活性和性能。

2024-05-21