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
}