如下代码,fill_vec 的参数为 mut vec: Vec<i32>
可以正常运行;如果参数改为 vec: &mut Vec<i32>
怎么写函数 fill_vec 呢?
我知道的一个写法:fn fill_vec(vec: &mut Vec<i32>) { ... }
mut 在函数参数中不同的位置,有什么区别呢,适用于什么应用场景呢?
fn main() {
let vec0 = Vec::new();
let mut vec1 = fill_vec(vec0);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
vec1.push(88);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
}
fn fill_vec(mut vec: Vec<i32>) -> Vec<i32> {
vec.push(22);
vec.push(44);
vec.push(66);
vec
}
fn fill_vec2(vec: &mut Vec<i32>) {
vec.push(1);
vec.push(2);
}
1
共 4 条评论, 1 页
评论区
写评论这样写也是可以的:
@whfuyn 你的代码存在如下问题:
应改为:
对以下内容的回复:
写在后面是参数变量类型的一部分,可变借用,表示可修改所绑定的的资源内容,写在前面指示参数变量本身绑定可变化,跟普通变量一样的。
另外如果是绑定拥有所有权的话,mut在前面有两层意思:
语义不一样。
fn f(mut vec: Vec<i32>)
中vec
的类型是Vec<i32>
,f(vec)
的调用是会把vec
给move掉的,f
会拿到vec的所有权,前面的mut
是指在f
这个函数里,vec
是可变的,和let mut vec = vec![]
意思差不多。fn f(vec: &mut Vec<i32>)
中vec
的类型是&mut Vec<32>
,是个可变借用,不会拿走所有权。作为对比,你可以再考虑一下两个位置都有mut的情况: