借用参数作为可变参数与拥有并返回它之间有区别吗?



考虑:

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"));
}

与。

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;
}

两种解决方案都将打印:

Example1
Example2

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

不,使用其中一种的代码功能实际上没有太大区别。

一个与另一个相比的大部分好处都超出了纯粹的能力:

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

取值与引用通常也是向用户发出有关代码预期用法的更好信号。

有一个层次结构,列出了哪些类型是可互操作的。如果您拥有值的所有权,则可以调用获取所有权的函数、可变引用或不可变引用。如果您有可变引用,则可以调用采用可变引用或不可变引用的函数。如果您有不可变引用,则只能调用采用不可变引用的函数。因此,接受最宽松的类型是很常见的。

最新更新