struct - 如何在调试输出中打印完整的结构路径?
问题描述
我有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 { ... }
内联在同一文件中的模块 - 不要同时使用两者,因为它是多余的。
推荐阅读
- python - Python 在相同的文本文件上返回不同的结果
- angular - 装饰器的实验性支持警告 1 文件
- vue.js - 为什么我的 Vue 路由器没有路由到我的组件?
- android - 如何以编程方式从移动设备中删除谷歌帐户
- javascript - 更改对象键和值
- node.js - 使用 ng server Angular 6 运行脚本
- c# - 如何实现定期缓存重载
- amazon-web-services - “BundleType 必须是 YAML 或 Json”错误使用 Jenkins 和 AWS CodeDeploy
- java - Java - 将子类赋予以父类为参数的方法
- python - 如何使用python自动重启discord bot