如何在各种类型的IntoIterator项目中允许多个特征实现?

时间:2015-12-26 11:40:36

标签: iterator rust traits

Rust似乎不区分特征的不同实现,只要它们因关联类型而不同。

如何在所有类型的集合/迭代器上实现一个方法,但是它们包含的每个具体类型都有特定的实现?

  

错误:trait Foo [E0119]

的实施冲突

The code

trait Foo { fn foo(self); }

impl<T> Foo for T 
    where T: IntoIterator<Item=u32> 
{
    fn foo(self) {
        self.into_iter();
    }
}

impl<T> Foo for T 
    where T: IntoIterator<Item=u16> 
{
    fn foo(self) {
        self.into_iter();
    }
}

fn main() {
    vec![0u32].foo();
    vec![0u16].foo();
}

1 个答案:

答案 0 :(得分:5)

您无法直接执行通用表单,即issue #20400。您必须引入可用作T::Item上的绑定的特征来合并两个实现或包装类型。例如。第一个看起来像:

trait FooIterItem {
    // behaviours needed for Foo impl
}
impl FooIterItem for u32 { ... }
impl FooIterItem for u16 { ... }

impl<T> Foo for T
    where T: IntoIterator, T::Item: FooIterItem
{
    ...
}