我有一个简单的链表类型和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,
}
}
}