2015-05-24 4 views
3

Я хочу осуществить черту Foo для Iterator (то есть, для всех типов, которые реализуют Iterator), поэтому я написал это:Реализовать черту для итератора + Clone: ​​конфликтующие реализации

trait Foo { 
    fn foo(&self); 
} 

impl<F, FI> Foo for FI 
    where F: Foo, 
      FI: Iterator<Item=F> + Clone, 
{ 
    fn foo(&self) { 
     // Just for demonstration 
     for x in self.clone() { 
      x.foo(); 
     } 
    } 
} 

До сих пор он компилирует. Однако, когда я дополнительно реализовать Foo для другого типа, как

impl Foo for u32 { 
    fn foo(self) { println!("{} u32", self); } 
} 

Я получаю следующее сообщение об ошибке:

t.rs:5:1: 7:2 error: conflicting implementations for trait `Foo` [E0119] 
t.rs:5 impl Foo for u32 { 
t.rs:6  fn foo(self) { println!("{} u32", self); } 
t.rs:7 } 
t.rs:9:1: 18:2 note: note conflicting implementation here 
t.rs:9 impl<F, FI> Foo for FI 
t.rs:10  where F: Foo, 
t.rs:11   FI: Iterator<Item=F> + Clone, 
t.rs:12 { 
t.rs:13  fn foo(&self) { 
t.rs:14   for x in self.clone() { 

Как решить эту проблему?

(Playground)

ответ

5

Короткий ответ, что вы не можете. Поскольку вы не можете удостовериться, что u32 в какой-то момент не будет реализовывать Iterator, реализации действительно конфликтуют. Если вы действительно хотите реализовать его как для Iterator, так и для u32, вам нужно каким-то образом сделать реализации отдельными. Один из способов сделать это - реализовать его вместо &'a FI, поскольку u32 никогда не сможет стать ссылкой. В качестве альтернативы вы можете обернуть итератор в структуре, хотя это сделает его несколько менее эргономичным для использования.

+0

Я вижу, спасибо. Что Руста должна предложить, чтобы сделать эту работу? Отрицательные границы признаков? Специализированные реализации признаков? –

+0

Требуется какая-то специализация. Мы точно не знаем, какое решение лучше всего работает. – bluss

+0

Но откуда вы знаете, что '& 'a u''''', в какой-то момент, реализует' Iterator'? Я не думаю, что это действительно объясняет, почему работает ссылка на ссылки? – mako

Смежные вопросы