问题描述
我具有以下结构:
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
枚举为准)。
尝试
-
我尝试为
IntoIter
实现Outer
,但是由于rustc --explain E0207,这无法正常工作,因为我无法将IntoIter<Item = T>
绑定到某些特征 -
创建一个包装通用结构,该结构还包含一个
PhantomData
来捕获类型,并且为此实现了IntoIter
。这也不起作用,因为它不返回Item
类型(通用),而是返回特定的One
或Two
。从以下版本开始不起作用,但我希望它能做到: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 (将#修改为@)