考虑:
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"));
}
vs。
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
有什么区别吗?我们应该使用什么?
答案 0 :(得分:3)
不,使用其中一种代码的能力确实没有太大差异。
一个人与另一个人相比的大多数好处都在于纯能力之外:
对于代码的用户来说,引用通常更符合人体工程学:他们不必继续记住为每个函数调用分配返回值。
将值与参考进行比较通常也可以更好地向您的用户传达代码的预期用途。
存在可互操作类型的层次结构。如果您拥有值的所有权,则可以调用获取所有权,可变引用或不可变引用的函数。如果具有可变引用,则可以调用采用可变引用或不可变引用的函数。如果您有不可变的引用,则只能调用采用不可变的引用的函数。因此,通常会接受最宽松的类型。