【问题标题】:In Rust, is a vector an Iterator?在 Rust 中,向量是迭代器吗?
【发布时间】:2023-03-25 19:00:02
【问题描述】:

说明向量(在其他集合类型中)是Iterator 是否准确?

例如,我可以通过以下方式循环一个向量,因为它实现了 Iterator 特征(据我了解):

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

for x in &v {
    println!("{}", x);
}

但是,如果我想使用属于 Iterator 特征的函数(例如 foldmapfilter),为什么必须首先在该向量上调用 iter()

我的另一个想法是向量可以转换为Iterator,在这种情况下,上面的语法更有意义。

【问题讨论】:

  • doc.rust-lang.org/book/iterators.html 说了一些关于for x in &vfor x in v.iter() 的内容,这也是有效的。我不知道 Rust(还)所以我实际上无法解释或总结它!

标签: iterator rust


【解决方案1】:

不,向量不是迭代器。

但它实现了 IntoIterator 特征,for 循环使用该特征将向量转换为所需的迭代器。

documentation for Vec中可以看到IntoIterator是通过三种方式实现的:

  • 对于Vec<T>,它被移动并且迭代器返回T类型的项目,
  • 对于共享引用&Vec<T>,其中迭代器返回共享引用&T
  • 对于&mut Vec<T>,返回可变引用。

iter() 只是Vec 中的一个方法,将Vec<T> 直接转换为返回共享引用的迭代器,而无需先将其转换为引用。有一个兄弟方法iter_mut() 用于生成可变引用。

【讨论】:

  • 有理由选择for foo in vec 而不是for foo in vec.iter()
  • 这取决于你在做什么,以及在循环之后你是否还需要vec。使用for foo in vec,向量的每个元素都被移动到foo,循环中的代码可以将它移动到其他地方,即重复使用它而不克隆它,所以如果元素很大,效率会更高。写的也少,所以你总是可以先试试for foo in vec,如果不行,借用检查器会提醒你。
  • 那么,调用for foo in vecfor foo in vec.into_iter() 的同义词对吗?并且for foo in &vecfor foo in vec.iter() 相同,for foo in &mut vecfor foo in vec.iter_mut() 相同?
猜你喜欢
  • 2021-11-24
  • 2012-12-13
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多