Appearance
5.6 Derive
Rust 里面为类型 impl 某些 trait 的时候,逻辑是非常机械化的。为许多类型重复而单调地 impl 某些 trait,是非常枯燥的事情。为此,Rust 提供了一个特殊的 attribute,它可以帮我们自动 impl 某些 trait。示例如下:
rust
#[derive(Copy, Clone, Default, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
struct Foo {
data : i32
}
fn main() {
let v1 = Foo { data : 0 };
let v2 = v1;
println!("{:?}", v2);
}
如上所示,它的语法是,在你希望 impl trait 的类型前面写#[derive(…)]
,括号里面是你希望 impl 的 trait 的名字。这样写了之后,编译器就帮你自动加上了 impl 块,类似这样:
rust
impl Copy for Foo { ... }
impl Clone for Foo { ... }
impl Default for Foo { ... }
impl Debug for Foo { ... }
impl Hash for Foo { ... }
impl PartialEq for Foo { ... }
......
这些 trait 都是标准库内部的较特殊的 trait,它们可能包含有成员方法,但是成员方法的逻辑有一个简单而一致的“模板”可以使用,编译器就机械化地重复这个模板,帮我们实现这个默认逻辑。当然我们也可以手动实现。
目前,Rust 支持的可以自动 derive 的 trait 有以下这些:
rust
Default
Debug
Clone
Copy
Eq
FromPrimitive
Hash
Ord
PartialEq
ParialOrd
RustcEncodable
RustcDecodable
Send
Sync