首页 > 解决方案 > 如何在调试输出中打印完整的结构路径?

问题描述

我有mymod.rs

pub mod mymod {
    #[derive(Debug)]
    pub struct mystruct {                          
        pub x: i32,
    }
}

并且main.rs

mod mymod;
use mymod::mymod::mystruct;
fn main() {
    let x = mystruct { x: 10 };
    println!("{:#?}", x);
}

输出是:

mystruct {
    x: 10,                                                    
}

我可以让它显示以下文本:

mymod::mymod::mystruct {
    x: 10,                                                    
}

?

标签: structrustprintln

解决方案


为了对结构的格式进行任何更改,您必须手动实现Debug而不是使用#[derive(Debug)]. 这是一个产生您想要的输出的实现:

pub mod mymod {
    use std::fmt;

    pub struct mystruct {                          
        pub x: i32,
    }
    
    impl fmt::Debug for mystruct {
        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
            f.debug_struct(std::any::type_name::<Self>())
                .field("x", &self.x)
                .finish()
        }
    }
}

操场

可能还有一个库提供了一个备用派生宏Debug,可以将其配置为以这种方式打印类型名称,但我碰巧不知道。

顺便说一句,我注意到你有mymod::mymod。这不是构造 Rust 代码的常用方法。当您编写时mod mymod;它本身会创建一个模块。模块的文件通常不应包含mod mymod { ... }在其中;这是创建两个具有相同名称的模块级别。用于mod mymod;单独的文件或mod mymod { ... }内联在同一文件中的模块 - 不要同时使用两者,因为它是多余的。


推荐阅读