我有一个简单的链表类型和Clone的实现
它:

#[deriving(Show)]
enum List {
    Cons(int, Box<List>),
    Nil,
}

impl Clone for List {
    fn clone(&self) -> List {
        match *self {
            Cons(val, ref rest) => Cons(val, rest.clone()),
            Nil => Nil,
        }
    }
}

它按预期工作。但是如果我用
the same signature
MyClone一样,我得到一个错误:
trait MyClone {
    fn my_clone(&self) -> Self;
}

impl MyClone for List {
    fn my_clone(&self) -> List {
        match *self {
            Cons(val, ref rest) => Cons(val, rest.my_clone()),
            Nil => Nil,
        }
    }
}

.../src/main.rs:23:46: 23:61 error: mismatched types: expected `Box<List>`, found `List` (expected box, found enum List)
.../src/main.rs:23             Cons(val, ref rest) => Cons(val, rest.my_clone()),

如果我把它改成Clone就行了,但是我没有
明白为什么。box rest.my_clone()MyClone特性是相同的,因此
在我看来,他们也会接受同样的做法。
(我每晚用rustc 0.12.0编译(72841b128 2014-09-21 20:00:29+0000)。)

最佳答案

这是因为rust还实现了Clone forBox<T>。如果对它执行MyClone,它将按预期工作。

#[deriving(Show)]
enum List {
    Cons(int, Box<List>),
    Nil,
}

trait MyClone {
    fn my_clone(&self) -> Self;
}

impl<T: MyClone> MyClone for Box<T> {
    fn my_clone(&self) -> Box<T> {
        self.my_clone()
    }
}

impl MyClone for List {
    fn my_clone(&self) -> List {
        match *self {
            Cons(val, ref rest) => Cons(val, rest.my_clone()),
            Nil => Nil,
        }
    }
}

07-26 07:40