自定义 Derive

Minimum Rust version: 1.15

在 Rust 中,你始终可以能够通过derive属性来自动实现一些特性:


#![allow(unused_variables)]
fn main() {
#[derive(Debug)]
struct Pet {
    name: String,
}
}

Pet 实现了 Debug 特性, 使用了相当少的代码,非常醒目。举个例子,如果没有 derive,你需要这样写:


#![allow(unused_variables)]
fn main() {
use std::fmt;

struct Pet {
    name: String,
}

impl fmt::Debug for Pet {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Pet { name } => {
                let mut debug_trait_builder = f.debug_struct("Pet");

                let _ = debug_trait_builder.field("name", name);

                debug_trait_builder.finish()
            }
        }
    }
}
}

哈!

但是,这仅适用于作为标准库的一部分提供的特征; 它不可定制。 但是现在,当有人想要推导出你的特质时,你可以告诉Rust要做什么。 这在serdeDiesel等流行的crate中大量使用。

获取更多信息,包括如果构建你自己的derive,查阅 The Rust Programming Language.