跟type alias类似的,trait也可以起别名(trait alias)。假如在某些场景下,我们 有一个比较复杂的trait: pub trait Service { type Request; type Response; type Error; type Future: Future; fn call(&self, req: Self::Request) -> Self::Future; } 每次使用这个trait的时候都需要携带一堆的关联类型参数。为了避免这样的麻 烦,在已经确定了关联类型的场景下,我们可以为它取一个别名,比如: trait HttpService = Service;

Rust里面为类型impl某些trait的时候,逻辑是非常机械化的。为许多类型重复而 单调地impl某些trait,是非常枯燥的事情。为此,Rust提供了一个特殊的attribute, 它可以帮我们自动impl某些trait。示例如下: #[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 块,类似这样: 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有以下这些: Debug Clone Copy Hash RustcEncodable RustcDecodable PartialEq Eq ParialOrd Ord Default FromPrimitive Send Sync

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: