派生属性和自己实现结构的特征有什么区别?

109*_*149 3 rust

我想知道,假设我的实现是有效的,例如#[derive(Debug)]属性和我自己实现std::fmt::Debug某些结构的特征(或可以用derive属性添加的任何其他特征)之间有什么区别?编译时间会有差异吗?性能差异?

什么时候应该使用derive属性,什么时候应该自己实现特征?

Mas*_*inn 5

derive只是提供了该特征的通常有用的实现(通常是用户想要的默认实现)。

\n

如果 derive 的行为是您正在寻找的,那么您应该 derive,仅此而已。这对于一般有用的行为来说很方便,例如 (Partial)Eq 的结构相等、为 Debug 打印字面意义的结构等。\xe2\x80\xa6 在使用结构/特征时,它没有什么区别。

\n

派生只是宏的一种特殊情况(自定义派生是 proc 宏),因此编译速度无限慢:rustc 需要先运行 proc 宏,然后编译其输出。但我怀疑这会产生任何真正的区别。

\n

  • 可能值得注意的是“derive”的主要烦恼:[即使不需要,它也会在类型参数上生成边界](https://github.com/rust-lang/rust/issues/26925)。这个“功能”经常让人们感到惊讶,唯一的解决办法就是自己实现它。 (2认同)