gpt4 book ai didi

pointers - 模仿 Rust 中的克隆特性

转载 作者:行者123 更新时间:2023-11-29 07:58:24 25 4
gpt4 key购买 nike

我有一个简单的链表类型和一个 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作为 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(),它可以正常工作,但我没有明白为什么。 MyCloneClone traits 是一样的,所以它在我看来,他们会接受相同的实现方式。

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

最佳答案

这是因为 Rust 还为 Box<T> 实现了 Clone。 .如果你实现 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,
}
}
}

关于pointers - 模仿 Rust 中的克隆特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26136207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com