自定义 Derive

Minimum Rust version: 1.15

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

  1. #[derive(Debug)]
  2. struct Pet {
  3. name: String,
  4. }

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

  1. use std::fmt;
  2. struct Pet {
  3. name: String,
  4. }
  5. impl fmt::Debug for Pet {
  6. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  7. match self {
  8. Pet { name } => {
  9. let mut debug_trait_builder = f.debug_struct("Pet");
  10. let _ = debug_trait_builder.field("name", name);
  11. debug_trait_builder.finish()
  12. }
  13. }
  14. }
  15. }

哈!

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

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