Я хочу осуществить черту 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() {
Как решить эту проблему?
Я вижу, спасибо. Что Руста должна предложить, чтобы сделать эту работу? Отрицательные границы признаков? Специализированные реализации признаков? –
Требуется какая-то специализация. Мы точно не знаем, какое решение лучше всего работает. – bluss
Но откуда вы знаете, что '& 'a u''''', в какой-то момент, реализует' Iterator'? Я не думаю, что это действительно объясняет, почему работает ссылка на ссылки? – mako