如何在调试输出中打印完整的结构路径?
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()
}
}
}
可能还有一个库为 Debug
提供了替代派生宏,可以配置为以这种方式打印类型名称,但我碰巧不知道一个。
顺便说一句,我注意到你有 mymod::mymod
。这不是构造 Rust 代码的常用方法;当您编写 mod mymod;
、 时,它本身 创建了一个模块。模块的文件通常不应包含 mod mymod { ... }
;那就是创建 两层 层的同名模块。将 mod mymod;
用于单独的文件,或将 mod mymod { ... }
用于同一文件中的内联模块——不要同时使用两者,因为它是多余的。
我有 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()
}
}
}
可能还有一个库为 Debug
提供了替代派生宏,可以配置为以这种方式打印类型名称,但我碰巧不知道一个。
顺便说一句,我注意到你有 mymod::mymod
。这不是构造 Rust 代码的常用方法;当您编写 mod mymod;
、 时,它本身 创建了一个模块。模块的文件通常不应包含 mod mymod { ... }
;那就是创建 两层 层的同名模块。将 mod mymod;
用于单独的文件,或将 mod mymod { ... }
用于同一文件中的内联模块——不要同时使用两者,因为它是多余的。