考虑:
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
有什么区别吗?我们应该使用什么?
不,使用其中一种的代码功能实际上没有太大区别。
一个与另一个相比的大部分好处都超出了纯粹的能力:
对于代码的用户来说,引用通常更符合人体工程学:他们不必继续记住分配每个函数调用的返回值。
取值与引用通常也是向用户发出有关代码预期用法的更好信号。
有一个层次结构,列出了哪些类型是可互操作的。如果您拥有值的所有权,则可以调用获取所有权的函数、可变引用或不可变引用。如果您有可变引用,则可以调用采用可变引用或不可变引用的函数。如果您有不可变引用,则只能调用采用不可变引用的函数。因此,接受最宽松的类型是很常见的。