deriving限制一些特定trait
CloneCopyDebugDefaultEqHashOrdPartialEqPartialOrd
其他一些实现trait
- 检查相等问题需要实现
core::cmp::PartialEq的trait - 构造和析构可以实现
new方法和Drop trait的drop方法 - 调用函数可以重载trait系统,有三个,分别是
Fn、FnMut和FnOnce - 如果需要实现打印输出功能,需要实现
fmt::Display trait(std::fmt::Display),错误输出则需要返回fmt::Result - 实现错误类型需要实现
error::Error trait(std::error)的description方法和cause方法 - 如果需要重载
+运算符可以通过重载Add特性实现 std::ops - 想要自定义指针类型,可以通过重载
Deref和DereMut(std::ops::Deref)特性的deref方法来实现解引用运算符 - 实现自定义派生属性,则需要在函数前加上
#[proc_macro_derive(attr_name)],并且input参数和返回值为TokenStream,实现函数名为derive1
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
35Add +.
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,foopath:一个受限的名字,指代路径。如:T::SpecialA、foo、std::iter等expr:一个表达式。如2+2;f(42)ty:一个类型。如i32;Vec<(char, String)>;&Tpat:一个模式。如:Some(t);_stmt:一个单独语句。如:let x = 3block:一个大括号界定的语句序列item:一个项。如fn foo() {}, struct Bar,模块、声明、函数定义、类型定义、结构体定义、impl实现等都是meta:一个元数据项,可以从属性中找到。如:cfg(target_os = “windows”),包含在#[…]或![…]属性内信息tt:TokenTree缩写,指代词条树vis:指代可见性,如publifetime:指代生命周期
对于原变量后面的记号有额外的规则:
- expr和stmt变量必须后跟任意一个:=> , ;
- ty和path变量必须后跟任意一个:=> , = | ; : > [ { as where
- pat变量必须后跟任意一个:=> , = | if in
- 其他变量可以跟任何记号
宏系统完全不处理解析模糊
- 通过在某些记号前面加上记号可以解决问题,如:
$(I $i:ident)* E $e:expr