gpt4 book ai didi

rust - 如何使特征(和实现它的结构)可克隆?

转载 作者:行者123 更新时间:2023-12-03 11:44:27 25 4
gpt4 key购买 nike

编译以下代码,出现如下错误。

error[E0277]: the trait bound `dyn T: std::clone::Clone` is not satisfied
--> src/main.rs:3:21

请帮助我修复代码。

Playground

trait T {}

#[derive(Clone)]
struct S1 { val: isize, nd:B ox<dyn T> }

#[derive(Clone)]
struct S2 { val: isize }

impl T for S1 {}
impl T for S2 {}

fn main() {
let x2 = S2 { val: 2 };
let x1 = S1 { val: 1, nd: Box::new(x2) };
let x1 = x1.clone();
}

最佳答案

编译器告诉你特征 CloneBox<dyn T> 不满意.

要解决这个问题,您可以做的是:

trait T: Clone {}

这将强制 T 的所有实现者实现Clone

这解决了一件事,但在这样做之后你会看到一个新的错误,不允许你构造一个特征对象。

error[E0038]: the trait `T` cannot be made into an object
--> /Users/mihir/fquicktest/data/user_data/instances/so_rust_q.rs:3:21
|
3 | struct S1{val:isize,nd:Box<dyn T>,}
| ^^^^^^^^^^^^^ the trait `T` cannot be made into an object
|
= note: the trait cannot require that `Self : Sized`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0038`.

我真的建议您阅读 rustc --explain E0038 .它的文档记录非常好,会向您解释无法创建特征对象的情况。

此外,要解决此问题,您可以使用 dyn-clone .

更新你的代码:

use dyn_clone::DynClone;

trait T: DynClone {}
dyn_clone::clone_trait_object!(T);

#[derive(Clone)]
struct S1 {
val: isize,
nd: Box<dyn T>,
}
#[derive(Clone)]
struct S2 {
val: isize,
}

impl T for S1 {}
impl T for S2 {}

fn main() {
let x2 = S2 { val: 2 };
let x1 = S1 {
val: 1,
nd: Box::new(x2),
};
let x1 = x1.clone();
}

dyn_clone docs 上有一些例子这可能会有更多帮助。

关于rust - 如何使特征(和实现它的结构)可克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64725210/

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