我有这样的结构
#[derive(CustomTrait)]
struct Sample {
v: Vec<u8>,
}
我的特质是这样的
trait CustomTrait {...}
我可以做上述事吗?它给我带来了一个错误。
我想要类似于Clone
特征的东西。这可能与Rust有关吗?
答案 0 :(得分:7)
#[derive(Foo, Bar)]
是#[derive_Foo] #[derive_Bar]
的糖,因此可以像#[derive_Clone]
一样实现自己的decorator属性,但是这需要你编写一个编译器插件,不是Rust的稳定部分,并且在1.0中不稳定(因此在稳定和测试版通道中不可用)。
There is a little documentation on such matters in the book,但不多;你很大程度上依靠自己。
请记住,在那个阶段你实际可以做的事情是有限的;您只能访问结构定义,并且对所提到的实际类型一无所知。这非常适合构建#[derive]
支持的所有特征,但不适用于许多其他特征。
答案 1 :(得分:5)
不,你不能。 derive
指示编译器提供特征的基本实现。您不能期望编译器神奇地知道如何实现用户定义的特征。
您只能使用derive
这些特征(取自http://rustbyexample.com/trait/derive.html):
Eq
,PartialEq
,Ord
,PartialOrd
Encodable
,Decodable
Clone
,通过副本从T
创建&T
。Hash
,用于计算&T
的哈希值。Rand
,用于创建数据类型的随机实例。Default
,用于创建数据类型的空实例。Zero
,用于创建数值数据类型的零实例。FromPrimitive
,用于从数字原语创建实例。Debug
,使用{:?}
格式化程序格式化值。注意:显然已经提出并正在讨论here