我正在学习所有权和借款。
borrow1
与borrow2
之间的区别在于&
中打印时borrow2
的使用情况:
fn borrow1(v: &Vec<i32>) {
println!("{}", &v[10] + &v[12]);
}
fn borrow2(v: &Vec<i32>) {
println!("{}", v[10] + v[12]);
}
fn main() {
let mut v = Vec::new();
for i in 1..1000 {
v.push(i);
}
borrow1(&v);
println!("still own v {} , {}", v[0], v[1]);
borrow2(&v);
println!("still own v {} , {}", v[0], v[1]);
}
为什么他们会提供相同的输出,即使borrow1
没有&
?
答案 0 :(得分:4)
[]
的索引运算符(Vec<T>
)返回T
。在这种情况下,那是i32
。因此,v[0]
会返回i32
,&v[0]
会返回&i32
:
let a: i32 = v[0];
let b: &i32 = &v[0];
v[0]
仅适用于i32
实施Copy
。
i32
已为(i32
, i32
)和(&i32
, &i32
)的(左侧,右侧)对实施Add
。这两个实现以相同的方式添加值,因此您得到相同的结果。
另见: