• 调试
    • 参见:

    调试

    所有要用到std::fmt格式化的traits类型都需要转化成可打印的实现。std库这些类型能够自动实现。但所有其他类型都必须手动来实现。

    fmt::Debug trait 使上面工作变得相当简单。所有类型都能推导(自动创建)fmt::Debug
    的实现。但是 fmt::Display 需要手动来实现。

    1. // 这种结构体不能使用`fmt::Display`或`fmt::Debug`来进行打印。
    2. struct UnPrintable(i32);
    3. // `derive`属性会自动创建实现,借助`fmt::Debug`使得这个`struct`能够打印。
    4. #[derive(Debug)]
    5. struct DebugPrintable(i32);

    所有std库类型加上{:?}后也能够自动打印:

    1. // 从 `fmt::Debug` 获得实现给 `Structure`。
    2. // `Structure` 是一个包含`i32`基本类型的结构体。
    3. #[derive(Debug)]
    4. struct Structure(i32);
    5. // 将 `Structure` 放到结构体 `Deep` 中。使 `Deep` 也能够打印。
    6. #[derive(Debug)]
    7. struct Deep(Structure);
    8. fn main() {
    9. // 打印操作使用 `{:?}` 和使用 `{}` 类似。
    10. println!("{:?} months in a year.", 12);
    11. println!("{1:?} {0:?} is the {actor:?} name.",
    12. "Slater",
    13. "Christian",
    14. actor="actor's");
    15. // `Structure` 是能够打印的类型。
    16. println!("Now {:?} will print!", Structure(3));
    17. // 使用 `derive` 的一个问题是不能控制输出的形式。
    18. // 假如我只想展示一个 `7`?
    19. println!("Now {:?} will print!", Deep(Structure(7)));
    20. }

    所以 fmt::Debug 确实使这些内容可以打印,但是牺牲了美感。手动执行 fmt::Display 将能够弥补这些问题。

    参见:

    attributes, derive, std::fmtstruct