实现Iterator和Clone特质:冲突的实现

3

我希望为Iterator(即所有实现了Iterator的类型)实现一个特性Foo,所以我写了以下代码:

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() {

我该怎么解决这个问题?

(游乐场)

1个回答

5
简短的回答是,你不能。因为你无法保证在某个时候不会实现<迭代器>,因此实现确实会发生冲突。如果您真的想为<迭代器>和两者都实现它,那么您需要以某种方式使实现分开。一种方法是改为实现<&'a FI>,因为永远不可能成为引用。或者,您可以将迭代器包装在结构中,但这将使使用略微不太方便。

我明白了,谢谢。为了使这个工作起来,Rust需要提供什么?否定的trait限制?专门的trait实现? - Adrian Willenbücher
需要某种专业化。我们还不确定哪种解决方案最好。 - bluss
但是你怎么知道&'a u32在某个时候不会实现Iterator呢?我认为这并没有真正解释为什么引用的impling有效? - mako

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接