如何使特征(以及实现它的结构)可克隆?

时间:2020-11-07 06:52:00

标签: rust

编译以下代码,将发生如下错误。

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: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();
}

1 个答案:

答案 0 :(得分:1)

编译器告诉您Clone不满足特征Box<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上有一些示例可能会有所帮助。