Rust 将参数作为可变参数借用与获取其所有权并返回之间有区别吗?

Rust 将参数作为可变参数借用与获取其所有权并返回之间有区别吗?,rust,Rust,考虑: fn main() { let mut words: Vec<String> = Vec::new(); words.push(String::from("Example1")); do_something(&mut words); for word in words.iter() { println!("{}", word); } } fn do_something(words: &mut Vec&

考虑:

fn main() {
    let mut words: Vec<String> = Vec::new();
    words.push(String::from("Example1"));
    do_something(&mut words);

    for word in words.iter() {
        println!("{}", word);
    }
}

fn do_something(words: &mut Vec<String>) {
    //modify vector, maybe push something:
    words.push(String::from("Example2"));
}

有什么区别吗?我们应该使用什么?

不,使用其中一种方法的代码的性能实际上没有太大差别

其中一个与另一个的大部分好处都不在纯功能范围内:

对代码的用户来说,引用通常更符合人体工程学:他们不必继续记住分配每个函数调用的返回值

获取一个值和一个引用通常也是向用户发出关于代码预期用途的更好的信号


有一个可互操作类型的层次结构。如果您拥有值的所有权,则可以调用具有所有权的函数、可变引用或不可变引用。如果有可变引用,则可以调用接受可变引用或不可变引用的函数。如果有不可变引用,则只能调用接受不可变引用的函数。因此,通常会接受您能接受的最宽松的类型。

注意:未调整大小的类型也因不能按值通过而值得注意,这可能会限制您的选择。@MatthieuM。说得好!我认为我们只考虑了两种选择都可行的地方。
fn main() {
    let mut words: Vec<String> = Vec::new();
    words.push(String::from("Example1"));
    words = do_something(words);

    for word in words.iter() {
        println!("{}", word);
    }
}

fn do_something(mut words: Vec<String>) -> Vec<String> {
    //modify vector, maybe push something:
    words.push(String::from("Example2"));
    return words;
}