0%

Rust一些结构体需要实现的trait特质

deriving限制一些特定trait

  • Clone
  • Copy
  • Debug
  • Default
  • Eq
  • Hash
  • Ord
  • PartialEq
  • PartialOrd

其他一些实现trait

  • 检查相等问题需要实现core::cmp::PartialEq的trait
  • 构造和析构可以实现new方法和Drop traitdrop方法
  • 调用函数可以重载trait系统,有三个,分别是FnFnMutFnOnce
  • 如果需要实现打印输出功能,需要实现fmt::Display trait(std::fmt::Display),错误输出则需要返回fmt::Result
  • 实现错误类型需要实现error::Error trait(std::error)的description方法和cause方法
  • 如果需要重载+运算符可以通过重载Add特性实现 std::ops
  • 想要自定义指针类型,可以通过重载DerefDereMut(std::ops::Deref)特性的deref方法来实现解引用运算符
  • 实现自定义派生属性,则需要在函数前加上#[proc_macro_derive(attr_name)],并且input参数和返回值为TokenStream,实现函数名为derive
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Add +.
    AddAssign +=.
    BitAnd &.
    BitAndAssign &=.
    BitOr |.
    BitOrAssign |=.
    BitXor ^.
    BitXorAssign ^=.
    Deref *v.
    DerefMut *v = 1;.
    Div /.
    DivAssign /=.
    Drop 'destructor'.
    Fn an immutable receiver.
    FnMut a mutable receiver.
    FnOnce a by-value receiver.
    Index (container[index]).
    IndexMut (container[index]).
    Mul *.
    MulAssign *=.
    Neg -.
    Not !.
    RangeBounds RangeBounds is implemented by Rust's built-in range types, produced by range syntax like .., a.., ..b, ..=c, d..e, or f..=g.
    Rem %.
    RemAssign %=.
    Shl <<
    ShlAssign <<=.
    Shr >>
    ShrAssign >>=.
    Sub -.
    SubAssign -=.
    CoerceUnsized Experimental Trait that indicates that this is a pointer or a wrapper for one, where unsizing can be performed on the pointee.
    DispatchFromDyn Experimental This is used for object safety, to check that a method's receiver type can be dispatched on.
    Generator Experimental The trait implemented by builtin generator types.
    Try Experimental A trait for customizing the behavior of the ? operator.

macro_rules片段分类符句法含义:

  • ident:一个标识符。如:x,foo
  • path:一个受限的名字,指代路径。如:T::SpecialA、foo、std::iter等
  • expr:一个表达式。如2+2;f(42)
  • ty:一个类型。如i32;Vec<(char, String)>;&T
  • pat:一个模式。如:Some(t);_
  • stmt:一个单独语句。如:let x = 3
  • block:一个大括号界定的语句序列
  • item:一个项。如fn foo() {}, struct Bar,模块、声明、函数定义、类型定义、结构体定义、impl实现等都是
  • meta:一个元数据项,可以从属性中找到。如:cfg(target_os = “windows”),包含在#[…]或![…]属性内信息
  • tt:TokenTree缩写,指代词条树
  • vis:指代可见性,如pub
  • lifetime:指代生命周期

对于原变量后面的记号有额外的规则:

  • expr和stmt变量必须后跟任意一个:=> , ;
  • ty和path变量必须后跟任意一个:=> , = | ; : > [ { as where
  • pat变量必须后跟任意一个:=> , = | if in
  • 其他变量可以跟任何记号

宏系统完全不处理解析模糊

  • 通过在某些记号前面加上记号可以解决问题,如:$(I $i:ident)* E $e:expr