loops - 迭代器是否返回对项目的引用或 Rust 中项目的值?

标签 loops rust

如果我有一个向量:

let mut v = vec![0, 1, 2, 3, 4, 5];

我遍历它:
for &item in v.iter() {}

&item这里是引用还是值(value)?似乎它是来自 & 的引用。部分,但阅读细节似乎表明这是一个值(value)???

最佳答案

Do iterators return a reference to items or the value of the items in Rust?



这个问题没有一般的答案。迭代器可以返回任何一个。您可以通过查找关联类型Iterator::Item找到项目的类型在文档中。 Vec::iter() 的文档,例如,告诉您返回类型是 std::slice::Iter . Iter 的文档依次具有该类型实现的特征列表,以及 Iterator trait是其中之一。如果你展开文档,你可以看到
type Item = &'a T

它告诉您迭代器的项目类型返回 Vec<T>::iter()&T ,即您获得对向量本身的项目类型的引用。

在符号
for &item in v.iter() {}
for之后的部分是与迭代器中的项目匹配的模式。在第一次迭代中 &item&0 匹配, 所以 item变成 0 .您可以在任何 Rust 介绍中阅读有关模式匹配的更多信息。

遍历向量 v 的另一种方法是写
for item in v {}

这将消耗向量,因此在循环后不能再使用它。所有项目都移出向量并按值返回。这使用 IntoIteratorVec<T> 实现的特征,所以在文档中查找它的项目类型!

上面的第一个循环通常写成
for &item in &v {}

v作为引用&Vec<i32> ,然后调用 IntoIterator在该引用上,它将返回相同的 Iter上面提到的类型,所以它也会产生引用。

关于loops - 迭代器是否返回对项目的引用或 Rust 中项目的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60780389/

相关文章:

rust - 如何创建具有特定值的 byte slice 常量?

rust - 为什么我不能直接访问枚举字段?

rust - 如何对使用 crate 中特征的函数进行文档测试?

javascript - 在 php 上循环不在 javascript 上运行

rust - 如何修复未使用的生命周期?

rust - 由于 Libsodium 在 : pwhash_argon2i and pwhash_argon2id 上失败, cargo 测试不再有效

c++ - 循环直到输入特定字符 (C++)

php - PHP while 循环中的 HTML 表单

java - 循环调整 - 我需要重写这个 Java 程序片段

java - 使用动态变量 Java 在循环中打印数组