deriving限制一些特定trait
Clone
Copy
Debug
Default
Eq
Hash
Ord
PartialEq
PartialOrd
其他一些实现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
,实现函数名为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
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