我们可以自动导出用户定义的特征吗?

时间:2015-03-24 12:59:36

标签: rust traits

我有这样的结构

#[derive(CustomTrait)]
struct Sample {
    v: Vec<u8>,
}

我的特质是这样的

trait CustomTrait {...}

我可以做上述事吗?它给我带来了一个错误。

我想要类似于Clone特征的东西。这可能与Rust有关吗?

2 个答案:

答案 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):

  • 比较特征:EqPartialEqOrdPartialOrd
  • 序列化:EncodableDecodable
  • Clone,通过副本从T创建&T
  • Hash,用于计算&T的哈希值。
  • Rand,用于创建数据类型的随机实例。
  • Default,用于创建数据类型的空实例。
  • Zero,用于创建数值数据类型的零实例。
  • FromPrimitive,用于从数字原语创建实例。
  • Debug,使用{:?}格式化程序格式化值。

注意:显然已经提出并正在讨论here