Vector 在Rust中迭代向量时何时使用引用?

Vector 在Rust中迭代向量时何时使用引用?,vector,rust,reference,Vector,Rust,Reference,我不知道什么时候使用参考资料。我有一个向量,我想遍历其中的元素 let v = vec![1, 2, 3, 4, 5]; 我可以通过两种方式使用for循环来实现这一点: 方法1 方法2 在方法1中,我使用引用访问向量v的内容。两个示例都编译并给出所需的输出。使用哪种方法及其原因?下面的代码消耗了v。虽然代码中的两个方法都做相同的事情,但是在方法2之后,您将无法访问v 现在,大多数情况下,除非您想使用向量,否则我们使用引用而不是值。如果给你一个切片或向量引用,比如说函数的输入,你只能使用方法1

我不知道什么时候使用参考资料。我有一个向量,我想遍历其中的元素

let v = vec![1, 2, 3, 4, 5];
我可以通过两种方式使用
for
循环来实现这一点:

方法1 方法2
在方法1中,我使用引用访问向量
v
的内容。两个示例都编译并给出所需的输出。使用哪种方法及其原因?

下面的代码消耗了
v
。虽然代码中的两个方法都做相同的事情,但是在方法2之后,您将无法访问
v

现在,大多数情况下,除非您想使用向量,否则我们使用引用而不是值。如果给你一个
切片
或向量引用,比如说函数的输入,你只能使用方法1

fn do_something(v: &[i32]) {
    // body of the function
}
参数类型也可以是
&Vec[i32]
。然而,这种方法有缺点


坏例子。在我看来,用户可以使用切片,但我想这并不能说明问题所在。所以,让我添加更新。所以,除非我想把值消耗掉,否则我就坚持引用,因为向量类型没有复制特性。向量只能被克隆,因为默认的拷贝像C++那样默认是昂贵的。如果是这样,那么为什么要通过索引访问向量——比如V(0)。不移动值?“方法2”使用向量并生成实际元素,而方法1仅借用向量,生成对元素的引用。使用哪种方法取决于你想要什么或需要什么。谢谢!这是有道理的。我坚持引用,因为向量类型没有复制特性?@VinetReddy,这取决于你在做什么。引用更为常见,但有时您有一些大型结构的引用,例如,
Box
es,希望将它们移到其他地方以避免重新分配,然后您将使用值。@VineRetredy您不应该这样限制自己,基本上第一个引用允许您借用
Vec
的元素,第二种方法是通过破坏
Vec
来拥有元素的所有权。剩下的取决于这个问题的答案:我需要所有权还是需要借钱?有关更多信息,您可能希望检查
Vec::iter()
Vec::into\u iter()
之间的差异。另请参阅此处链接的副本。
for element in v {
    println!("{}", element);
}
for element in v {
    println!("{}", element);
}
fn do_something(v: &[i32]) {
    // body of the function
}