2015-12-26 28 views
3

只有在相關類型不同的情況下,Rust纔會區分不同的性狀實現。如何在不同類型的IntoIterator項目上允許多個特徵實現?

如何在各種集合/迭代器上實現一個方法,但是它們包含的每個具體類型都有特定的實現?

error: conflicting implementations for 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(); 
} 

回答

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 
{ 
    ... 
} 
相關問題