我有一个简单的链表类型和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,
}
}
}
它按预期工作。但如果我自己制作MyClone
特质
the same signature
和Clone
一样,我收到错误:
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()),
如果我将其更改为box rest.my_clone()
,它可以正常工作,但我没有
明白为什么。 MyClone
和Clone
特征是相同的,所以它
在我看来他们会接受同样的实施。
(我正在使用rustc编译0.12.0-nightly(72841b128 2014-09-21 20:00:29 +0000)。)
答案 0 :(得分:5)
这是因为rust还实现了Box<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,
}
}
}