Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在枚举中使用复制的supertrait时,类型未实现复制错误_Rust_Trait Objects - Fatal编程技术网

Rust 在枚举中使用复制的supertrait时,类型未实现复制错误

Rust 在枚举中使用复制的supertrait时,类型未实现复制错误,rust,trait-objects,Rust,Trait Objects,我不熟悉锈菌特征,所以这可能是因为对supertraits、dyn或其他任何东西的误解。我试图在枚举中使用trait对象来: 在枚举的这个元素中可以使用的具体类型上放置一个trait绑定 确保枚举仍然可以派生Copy 最简单的示例(未能在上编译并出现相关错误)是: #[派生(复制)] enum Foo{ A. B(dyn MyTraitWhichIsCopy), } trait MyTraitWhichIsCopy:Copy{} 错误是: error[E0204]: the trait `

我不熟悉锈菌特征,所以这可能是因为对supertraits、
dyn
或其他任何东西的误解。我试图在枚举中使用trait对象来:

  • 在枚举的这个元素中可以使用的具体类型上放置一个trait绑定
  • 确保枚举仍然可以派生
    Copy
最简单的示例(未能在上编译并出现相关错误)是:

#[派生(复制)]
enum Foo{
A.
B(dyn MyTraitWhichIsCopy),
}
trait MyTraitWhichIsCopy:Copy{}
错误是:

error[E0204]: the trait `Copy` may not be implemented for this type
 --> src/lib.rs:1:10
  |
1 | #[derive(Copy)]
  |          ^^^^
...
4 |     B(dyn MyTraitWhichIsCopy),
  |       ---------------------- this field does not implement `Copy`
  |
  = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error

For more information about this error, try `rustc --explain E0204`.
调用
rustc--explain E0204
后,我注意到以下问题,这可能是我遇到问题的地方:

The `Copy` trait is implemented by default only on primitive types. If your
type only contains primitive types, you'll be able to implement `Copy` on it.
Otherwise, it won't be possible.

有什么方法可以完成我想做的吗?

你可以使用一个由你的特质绑定的泛型类型。另外请注意,您还需要
Clone
来进行
Copy

#[派生(克隆,复制)]
enum Foo{
A.
B(T),
}
trait MyTraitWhichIsCopy:Copy{}

您可以使用由您的特质绑定的泛型类型。另外请注意,您还需要
Clone
来进行
Copy

#[派生(克隆,复制)]
enum Foo{
A.
B(T),
}
trait MyTraitWhichIsCopy:Copy{}

给定代码中有几个问题

  • trait
    Clone
    不是对象安全的,因为方法
    Clone
    引用原始自我类型,而原始自我类型通过
    dyn
    抽象未知。你的特征有一个超级特征
    Copy
    Copy
    有一个超级特征
    Clone
    ,因此你的特征不是对象安全的,这意味着它不能用作特征对象,也称为“
    dyn
    trait”

  • Trait对象的大小为
    ?size
    ,这意味着它是一个动态大小类型(DST,其大小在编译时未知),不能用作枚举字段,因为它还使枚举类型的大小为
    。在大多数情况下,DST只能通过引用来持有,实际上是拥有时的
    ,否则
    &dyn Trait
    &mut dyn Trait

  • Copy
    需要super-trait
    Clone
    ,这意味着“任何实现
    Copy
    的类型都必须实现
    Clone
    ”。因此,当我们希望自定义类型实现
    Copy
    时,我们应该首先实现
    Clone

  • 结论:不可能通过特征对象约束类型实现
    复制
    克隆
    ,您必须使用
    来保存特征对象,并使用手动定义的克隆而不是标准克隆特征,并为装箱的特征对象实现克隆:

    trait-MyTrait{
    fn clone_dyn(&self)->Box;
    }
    #[衍生(克隆)]
    结构MyImpl;
    MyImpl的impl-MyTrait{
    fn克隆动态(&self)->框{
    Box::new(self.clone())
    }
    }
    盒子的impl克隆{
    fn克隆(&self)->self{
    self.clone_dyn()
    }
    }
    #[衍生(克隆)]
    enum Foo{
    A.
    B(框),
    }
    
    给定代码中有几个问题

  • trait
    Clone
    不是对象安全的,因为方法
    Clone
    引用原始自我类型,而原始自我类型通过
    dyn
    抽象未知。你的特征有一个超级特征
    Copy
    Copy
    有一个超级特征
    Clone
    ,因此你的特征不是对象安全的,这意味着它不能用作特征对象,也称为“
    dyn
    trait”

  • Trait对象的大小为
    ?size
    ,这意味着它是一个动态大小类型(DST,其大小在编译时未知),不能用作枚举字段,因为它还使枚举类型的大小为
    。在大多数情况下,DST只能通过引用来持有,实际上是拥有时的
    ,否则
    &dyn Trait
    &mut dyn Trait

  • Copy
    需要super-trait
    Clone
    ,这意味着“任何实现
    Copy
    的类型都必须实现
    Clone
    ”。因此,当我们希望自定义类型实现
    Copy
    时,我们应该首先实现
    Clone

  • 结论:不可能通过特征对象约束类型实现
    复制
    克隆
    ,您必须使用
    来保存特征对象,并使用手动定义的克隆而不是标准克隆特征,并为装箱的特征对象实现克隆:

    trait-MyTrait{
    fn clone_dyn(&self)->Box;
    }
    #[衍生(克隆)]
    结构MyImpl;
    MyImpl的impl-MyTrait{
    fn克隆动态(&self)->框{
    Box::new(self.clone())
    }
    }
    盒子的impl克隆{
    fn克隆(&self)->self{
    self.clone_dyn()
    }
    }
    #[衍生(克隆)]
    enum Foo{
    A.
    B(框),
    }
    
    谢谢-我想我忽略了另一个隐含的要求-根据您声明枚举的类型,您不会得到单独的枚举实例。因此,我认为Alsein的答案更接近我的问题。谢谢-我认为我省略了另一个隐含的要求-根据声明枚举的类型,您不会得到单独的枚举实例。因此,我认为Alsen的回答更接近我的问题。谢谢-你提到的物体安全性是我以前从未见过的东西,并指出了这是一个问题@Kyle_S-CThanks-你提到的物体安全性是我以前从未见过的东西,并向我指出了这一点,即存在一个@Kyle_S-C