如何为特性门控的派生 trait 生成文档?
问题
我可以使用cfg_attr属性为类型有条件地派生Trait实现,比如下面的结构体MyStruct始终实现Clone、Copy和Debug,仅在启用my-feature特性时才实现PartialEq:
#[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "my-feature", derive(PartialEq))] struct MyStruct;
但我希望rustdoc生成的文档能明确说明MyStruct当且仅当启用my-feature特性时才实现PartialEq,目前只能得到两种不理想的结果:
- 启用
my-feature编译文档时,仅显示PartialEq实现,未标注特性门控; - 未启用
my-feature编译文档时,完全不显示MyStruct可实现PartialEq的信息。
解决方案
要让文档清晰体现特性门控的Trait实现,可通过两种方式结合实现:
1. 在结构体文档注释中明确说明
直接在结构体的文档注释里标注哪些Trait依赖特性,不管特性是否启用,用户都能在文档中看到这个说明:
#[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "my-feature", derive(PartialEq))] /// 示例结构体 /// /// ### 已实现的Trait /// - 始终可用:`Clone`、`Copy`、`Debug` /// - **仅当启用`my-feature`特性时可用**:`PartialEq` struct MyStruct;
2. 使用#[doc(cfg(...))]标注Trait实现
Rust提供的#[doc(cfg(feature = "my-feature"))]属性可以让rustdoc在文档中明确标注该Trait实现依赖的特性,无论特性是否启用,都会显示这个门控说明。
方式一:配合cfg_attr给派生的Trait添加标注
直接给cfg_attr追加doc属性,让派生的PartialEq实现带上特性标注:
#[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "my-feature", derive(PartialEq))] #[cfg_attr(feature = "my-feature", doc(cfg(feature = "my-feature")))] /// 示例结构体 /// /// ### 已实现的Trait /// - 始终可用:`Clone`、`Copy`、`Debug` /// - **仅当启用`my-feature`特性时可用**:`PartialEq` struct MyStruct;
方式二:手动实现Trait并添加标注
如果需要更灵活的控制,可以手动写出PartialEq的实现,然后给实现块加上#[doc(cfg(...))]:
#[derive(Clone, Copy, Debug)] /// 示例结构体 /// /// ### 已实现的Trait /// - 始终可用:`Clone`、`Copy`、`Debug` /// - **仅当启用`my-feature`特性时可用**:`PartialEq` struct MyStruct; #[cfg(feature = "my-feature")] #[doc(cfg(feature = "my-feature"))] impl PartialEq for MyStruct { fn eq(&self, other: &Self) -> bool { // 根据需求实现逻辑 true } }
这样处理后:
- 启用
my-feature时,文档会显示PartialEq实现,并标注“仅在my-feature特性下可用”; - 未启用
my-feature时,文档仍会显示PartialEq的条目,并明确说明它依赖my-feature特性。
内容的提问来源于stack exchange,提问作者RBF06
相关产品推荐
相关产品推荐

