【问题标题】:How to re-expose an IntoIterator implementation with generics?Rust:使用泛型重新公开 into_iter 实现?
【发布时间】:2022-12-05 16:09:49
【问题描述】:

我正在尝试生锈扩展 VecDeque 类以在最大容量后删除元素。可能已经有一些东西可以做到这一点,但我很固执,对 rust 比较陌生,想知道正确的方法来做到这一点。但是,我在使用泛型实现 IntoIterator 时遇到了困难,并且遇到了一个我不明白的错误。

 struct SlidingQueue<T> {
    data: VecDeque<T>,
    max_capacity: usize,
 }

 impl<T> SlidingQueue<T> {
//...
 }

 // just re-expose the VecDeque::IntoIter 
 impl<T> IntoIterator for SlidingQueue<T> {
    type Item=T;

    // type IntoIter=VecDeque<Self::Item>::IntoIter;
    type IntoIter: = VecDeque<T>::IntoIter;

    fn into_iter(self) -> Self::IntoIter {
        self.data.into_iter()
    }
}

这会产生:

error[E0223]: ambiguous associated type
  --> src\sliding_queue.rs:32:22
   |
32 |     type IntoIter: = VecDeque<T>::IntoIter;
   |                      ^^^^^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<VecDeque<T> as Trait>::IntoIter`

rustc --explain E0223 解释器似乎表明我在特征中引用了未定义的类型......但我认为那不是真的。我尝试执行编译器建议的操作也失败了(“特征”是什么特征?)。任何建议将不胜感激!

【问题讨论】:

  • 试试&lt;VecDeque&lt;T&gt; as IntoIterator&gt;::IntoIter
  • 解释看我回复this answer的评论

标签: generics rust


【解决方案1】:

编译器只是告诉你它不知道VecDeque&lt;T&gt;::IntoIter 来自哪里。

它可以来自 IntoIteratorVecDeque&lt;T&gt; 的实现,但它也可能来自一些不同的特征实现,这些特征实现也有一个名为 IntoIter 的关联类型。

所以你需要告诉编译从哪个特征中获取关联类型,使用完全合格的路径:

type IntoIter = <VecDeque<T> as IntoIterator>::IntoIter;

或者直接按照文档that tells us说这个类型命名为std::collections::vec_deque::IntoIter

type IntoIter = std::collections::vec_deque::IntoIter<T>;

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多