如何解决使用sysinfo crate trait的函数doctest编译失败问题?
解决sysinfo crate doctest中缺少SystemExt trait的问题
我之前也碰到过一模一样的问题,核心原因是doctest的编译上下文是完全独立的——哪怕你的主代码里已经导入了SystemExt trait,doctest的代码块也不会自动继承这些导入,必须在测试代码里单独处理。
下面是具体的解决步骤:
1. 在doctest代码块中显式导入trait
你的报错本质是total_memory()这类方法是SystemExt trait提供的扩展方法,而非System结构体本身的方法。所以必须在测试代码里导入这个trait,才能调用这些方法。
比如把你的函数文档改成这样:
/// 获取系统内存信息 /// /// # Examples /// /// ``` /// use sysinfo::{System, SystemExt}; /// /// let sys = System::new_all(); /// println!("总内存: {} bytes", sys.total_memory()); /// ``` pub fn get_memory_info() -> (u64, u64) { let mut sys = System::new_all(); sys.refresh_memory(); (sys.total_memory(), sys.used_memory()) }
2. (可选)隐藏导入语句让例子更简洁
如果你不想让用户看到导入代码,可以在use语句前加#,doctest会自动处理这些带#的行——编译时会包含它们,但显示给用户时会隐藏:
/// 获取系统内存信息 /// /// # Examples /// /// ``` /// # use sysinfo::{System, SystemExt}; /// let sys = System::new_all(); /// println!("总内存: {} bytes", sys.total_memory()); /// ```
3. 确认Cargo.toml的依赖配置
确保你的Cargo.toml里已经正确添加了sysinfo依赖,比如:
[dependencies] sysinfo = "0.29.0" # 替换成你实际使用的版本号
doctest会复用主代码的依赖配置,只要主代码能正常编译,doctest就能找到这个crate。
这样修改后,再运行cargo test应该就能正常编译并执行doctest了。
内容的提问来源于stack exchange,提问作者m00am
相关产品推荐
相关产品推荐

