Rust 在枚举中使用复制的supertrait时,类型未实现复制错误
我不熟悉锈菌特征,所以这可能是因为对supertraits、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 `
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{}
给定代码中有几个问题
Clone
不是对象安全的,因为方法Clone
引用原始自我类型,而原始自我类型通过dyn
抽象未知。你的特征有一个超级特征Copy
和Copy
有一个超级特征Clone
,因此你的特征不是对象安全的,这意味着它不能用作特征对象,也称为“dyn
trait”
?size
,这意味着它是一个动态大小类型(DST,其大小在编译时未知),不能用作枚举字段,因为它还使枚举类型的大小为。在大多数情况下,DST只能通过引用来持有,实际上是拥有时的框
,否则&dyn Trait
或&mut dyn Trait
Copy
需要super-traitClone
,这意味着“任何实现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(框),
}
给定代码中有几个问题
Clone
不是对象安全的,因为方法Clone
引用原始自我类型,而原始自我类型通过dyn
抽象未知。你的特征有一个超级特征Copy
和Copy
有一个超级特征Clone
,因此你的特征不是对象安全的,这意味着它不能用作特征对象,也称为“dyn
trait”
?size
,这意味着它是一个动态大小类型(DST,其大小在编译时未知),不能用作枚举字段,因为它还使枚举类型的大小为。在大多数情况下,DST只能通过引用来持有,实际上是拥有时的框
,否则&dyn Trait
或&mut dyn Trait
Copy
需要super-traitClone
,这意味着“任何实现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