如何在调试输出中打印完整的结构路径?

How to print full struct path in Debug output?

我有 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,                                                    
}

?

为了对结构的格式进行任何更改,您必须手动实施 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()
        }
    }
}

Playground

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

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