刚看完 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 上没有关于这两者区别的讨论,只是写了借用的做法。希望有人可以指教一下这两者的区别~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.