在Rust中模仿克隆特征

时间:2014-10-01 07:26:42

标签: pointers rust

我有一个简单的链表类型和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 signatureClone一样,我收到错误:

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(),它可以正常工作,但我没有 明白为什么。 MyCloneClone特征是相同的,所以它 在我看来他们会接受同样的实施。

(我正在使用rustc编译0.12.0-nightly(72841b128 2014-09-21 20:00:29 +0000)。)

1 个答案:

答案 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,
        }
    }
}