微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何实现一个返回实现某些特征的项目的迭代器?

如何解决如何实现一个返回实现某些特征的项目的迭代器?

我具有以下结构:

trait DoesIt: Sized {
    fn do_it(self) -> usize {
        // Only adding default impl for this example,// normally these are different for the One and Two below;
        3
    }
}

struct One {}

struct Two {}

impl DoesIt for One {}
impl DoesIt for Two {}

enum Container {
    Ones(Vec<One>),Twos(Vec<Two>),}

trait HasContainer {
    fn get(self) -> Container;
}

struct Outer {
    container: Container,}

impl HasContainer for Outer {
    fn get(self) -> Container {
        self.container
    }
}

我想拥有一个特征Works,如果实现该特征,它将允许遍历实现DoesIt的事物-在这种情况下为One s或Two es (以Container枚举为准)。

尝试

  1. 我尝试为IntoIter实现Outer,但是由于rustc --explain E0207,这无法正常工作,因为我无法将IntoIter<Item = T>绑定到某些特征

  2. 创建一个包装通用结构,该结构还包含一个PhantomData来捕获类型,并且为此实现了IntoIter。这也不起作用,因为它不返回Item类型(通用),而是返回特定的OneTwo。从以下版本开始不起作用,但我希望它能做到:

    struct PhantomContainer<T: DoesIt,S> {
        a_type: PhantomData<S>,pub it: T,}
    
    impl<T,I> for PhancomContainer<T,I>
    where
        I: DoesIt,T: HasContainer,{
        type Item = I;
        type IntoIterator = std::vec::IntoIter<Self::Item>;
    
        fn into_iter(self) -> Self::IntoIter {
            match self.it.get() {
                Container::Ones(ones) => (ones as Vec<I>).into_iter(),Container::Twos(twoes) => (twoes as Vec<I>).into_iter(),}
        }
    }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。