【问题标题】:Is there a trait supplying `iter()`?是否有提供 `iter()` 的特征?
【发布时间】:2016-09-24 11:43:01
【问题描述】:

Rust 中是否有提供 iter() 方法的 Trait?我只找到了特征IntoIterator,它提供了into_iter()

在这里要明确一点:我不想要提供 next()Iterator 特征,而是提供 iter() 的特征。

[ 旁注:有时我对 Rust 库感到非常困惑。 Iterator 提供 next(),但 IntoIterator 提供 into_iter()(不提供 next() 并用于移动约定),而 IntoIter 是一个结构,它实现了 Iterator 特征(移动值)。 ]

【问题讨论】:

标签: iterator rust traits


【解决方案1】:

不,没有提供iter() 的特征。

但是,IntoIterator 是在对某些容器的references 上实现的。例如,Vec<T>, &Vec<T> and &mut Vec<T> 是实现IntoIterator 的三种不同类型,您会注意到它们都映射到不同的迭代器。实际上,Vec::iter()Vec::iter_mut() 只是分别相当于 &Vec::into_iter()&mut Vec::into_iter() 的便捷方法。

fn foo(_x: std::slice::Iter<i32>) {}

fn main() {
    let v = vec![1, 2, 3];
    foo(v.iter());
    foo((&v).into_iter()); // iter() exists because this is awkward
}

如果你想编写一个对容器通用的函数,该函数可以转换为迭代引用的迭代器,你可以这样做:

fn foo<'a, I: IntoIterator<Item=&'a i32>>(_x: I) {}

fn main() {
    let v = vec![1, 2, 3];
    foo(&v);
}

【讨论】:

  • 哇。非常感谢您的解释。结合starblue评论中的链接,这就是我所需要的!
  • 为什么 rust 不提供 iter() 的特征?这听起来非常有用,例如,如果我想要一个具有通用容器作为成员的结构。 into_iter() 使用原始容器,如果有一个方法可以返回对容器的引用的迭代器而不使用它。
  • @kmaork 这个答案的意思是没有必要:如果你在 shared reference 上调用 into_iter() 到一个容器,你会得到一个引用的迭代器,与调用iter() 相同。当IntoIterator::into_iter() 已经解决了这个问题时,不需要提供iter() 的特征。也许您需要的是higher-ranked trait bound
  • 您在回答中说“IntoIterator 是在对某些容器的引用上实现的”。这是否意味着它没有普遍实施?如果是这样,如何在不消耗通用容器的情况下对其进行迭代?
  • 每个容器类型T 都需要实现IntoIterator 以引用T,这是没有办法的。当您在 &amp;T 上调用 into_iter() 时,您正在“使用”引用,但这不会使用底层容器。
猜你喜欢
  • 2021-07-22
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2021-01-27
  • 2012-12-24
  • 2016-05-20
  • 2020-08-16
相关资源
最近更新 更多