我现在正在学习生锈,似乎无法理解在书中的这个例子中使用
&
的意义:https://doc.rust-lang.org/stable/book/ch08-01- vectors.html#reading-elements-of-vectors
let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2];
这两个代码示例不是等价的吗?
let v = vec![1, 2, 3, 4, 5];
let third: i32 = v[2];
我对
&i32
特别困惑。关键是,我在i32
处共享指向index 2
的相同指针吗?这有可能吗,因为我认为简单的值总是会被复制,因此你不能从两个地方引用一个简单的值。
如果有人能帮我解决这个问题,我将不胜感激。
这有可能吗,因为我认为简单的值总是会被复制,因此你不能从两个地方引用一个简单的值。
规则不是复制而不是引用“简单值”(更准确地说,是实现
Copy
特征的值)。相反,它们是被复制而不是moved。复制发生在let third: i32 = v[2];
点,如果您使用非Copy
类型,那么它将是一个错误:
let v = vec![vec![1, 2], vec![3, 4], vec![5, 6]];
// error[E0507]: cannot move out of index of `Vec<Vec<i32>>`
let third: Vec<i32> = v[2];
(如果您想复习这些概念,请参阅 §4.1 什么是所有权? 讨论移动、副本和
Copy
。)
Rust 允许你引用任何类型。有时这是毫无意义的;例如,
&i32
并不比 i32
更有用,但您仍然可以创建它。 (但是 &mut i32
可能对就地修改 i32
很有用。)
所以,这两个例子都是允许的。在使用
i32
的实际程序中(而不是其他一些非Copy
类型),您几乎总是会编写第二个——但是使用 Copy
类型允许 demonstring the relationship.