为何调试打印env_logger::Builder会显示“Logger { ... }”?
问题
测试代码如下:
use env_logger::Builder; fn main() { let mut builder = Builder::new(); println!("{:?}", builder); }
调试输出为:
Logger { filter: Filter { filter: None, directives: [] }, writer: Builder { target: stderr, write_style: Auto, is_test: false, built: false } }
明明查看env_logger的logger.rs源码时,Builder::new()返回的是Builder结构体:
#[derive(Default)] pub struct Builder { filter: env_filter::Builder, writer: writer::Builder, format: fmt::Builder, built: bool, } impl Builder { pub fn new() -> Builder { Default::default() } }
但打印结果却是Logger结构体,这是为什么?
解答
核心原因是你实际使用的env_logger版本和查看的源码版本不一致。
你查看的是某个旧版本env_logger的logger.rs代码,其中Builder::new()确实返回Builder结构体;但你项目中依赖的env_logger是较新的版本,在这个版本的设计中,顶层导出的Builder已经被调整:
- 要么是
Builder::new()方法的返回值类型改为了Logger; - 要么是顶层的
Builder其实是Logger的别名或内部包装结构体,其Debug输出会显示为Logger。
你可以在项目中执行cargo doc --open,查看本地依赖的env_logger官方文档,确认Builder::new()的返回类型以及Builder结构体的定义,就能明确版本间的差异。
内容的提问来源于stack exchange,提问作者王老吉
相关产品推荐
相关产品推荐

