如何隐藏lazy_static crate生成的Statics与Functions不被cargo doc收录?
解决lazy_static生成的锁相关结构在cargo doc里乱显示的问题
为啥会出现这问题
lazy_static宏会自动生成带锁标记的辅助结构体(比如带LAZY后缀的类型)、静态变量和关联函数,这些默认会被cargo doc收录显示,导致文档冗余。直接在lazy_static!宏外层加#[doc(hidden)]没用,编译器会提示“unused attribute doc”——因为这个属性得作用在具体项上,不能直接套在宏本身。
管用的解决办法
办法1:给每个静态变量单独加#[doc(hidden)]
别把属性套在宏外层,直接加在宏内部的每个静态项上:
lazy_static! { #[doc(hidden)] static ref RE_EMAIL: Regex = Regex::new(r"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$").unwrap(); #[doc(hidden)] static ref RE_PHONE: Regex = Regex::new(r"^\d{11}$").unwrap(); }
这么写后,cargo doc会隐藏这些静态变量,以及lazy_static为它们生成的所有辅助结构体、函数。
办法2:用lazy_static自带的#[lazy_static(doc_hidden)]属性(推荐)
lazy_static本身提供了专门控制文档隐藏的属性,在宏内部的静态项上加#[lazy_static(doc_hidden)],能精准隐藏宏生成的辅助代码。无论是只藏辅助项、保留静态变量文档,还是连变量一起隐藏,都能用这个方式:
lazy_static! { // 保留静态变量文档,仅隐藏锁相关辅助结构 #[lazy_static(doc_hidden)] /// 匹配邮箱的正则表达式 static ref RE_EMAIL: Regex = Regex::new(r"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$").unwrap(); // 静态变量带辅助结构一起隐藏 #[lazy_static(doc_hidden)] #[doc(hidden)] static ref RE_PHONE: Regex = Regex::new(r"^\d{11}$").unwrap(); }
办法3:把lazy_static代码放进私有模块
如果这些静态变量不需要对外暴露,直接扔私有模块里即可——私有模块的内容默认不会出现在cargo doc的公共文档中:
mod private { use lazy_static::lazy_static; use regex::Regex; lazy_static! { pub static ref RE_EMAIL: Regex = Regex::new(r"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$").unwrap(); pub static ref RE_PHONE: Regex = Regex::new(r"^\d{11}$").unwrap(); } } // 对外暴露时直接引用私有模块内容,文档只会显示你指定的接口 pub use private::*;
验证方式
执行cargo doc --open重新生成文档,检查那些自动生成的锁相关结构是否已被隐藏。
内容的提问来源于stack exchange,提问作者Fabio Matos
相关产品推荐
相关产品推荐

