刚看完 rust 官方教程,感觉非常新鲜,上手就写了一个 two sum 的题( leetcode 居然支持 rust 了)。
写的过程中发现一个不解之处,在对Vector和列表中的元素进行引用的时候一般会写let x = &vec[0];,不过如果直接写let x = vec[0]同样是可以使用的,只是x的类型不同,如果vec里的元素都是i32的话,不加&的写法输出的x会是i32类型。而且,在let x = vec[0]之后,vec[0]仍然可以访问,也就是说并没有失去所有权,于是怀疑这里做了克隆。继续进行测试:
#[derive(Debug)]
struct Val {
val: i32,
}
fn main() {
let vec = vec![Val{ val: 0 }, Val{ val: 1 }, Val{ val: 2 }];
let x = vec[0];
println!("x: {:?}", x);
}
在let x = vec[0]处会提示cannot move out of borrowed content错误,反而let x = &vec[0]是可行的,给Val结构添加#[derive(Clone)]标注依然会有错误,所以好像这也并不是在做克隆。rust book 上没有关于这两者区别的讨论,只是写了借用的做法。希望有人可以指教一下这两者的区别~