我正在实现文件格式解析器,并且有一个enum
,它反映了文件规范中允许的常规块。像这样:
#[derive(Debug)]
pub enum FileChunk {
FileVersionChunk { major: u16, minor: u16 },
AuthorChunk { name: String },
// many many more variants following the specs...
DataChunk { data: Vec<u8> },
}
出于调试目的,我想为此枚举实现Debug
特性。标准实现#[derive(Debug)]
为此非常有用,但存在一个问题:DataChunk
之类的某些变体包含巨大的数据元素,我想在调试输出中将其缩写。如何做到这一点?
我对Rust还是陌生的-天真的,我会看到两种方法:
#[derive(Debug)]
实现,但以某种方式覆盖某些变体应具有特殊的实现。但是,如果在Rust中可能发生类似的事情,我无法弄清楚。#[derive(Debug)]
实现,并显式实现特征。在这种情况下,我试图找到一种解决方案,该解决方案只能手动实现特定的变体DataChunk
,但对于所有其他情况 1 都只能采用默认实现。但是我不知道如何进行这种后备工作。我尝试了以下方法作为测试,但这会导致无限递归,因为write!
表达式基本上会再次调用fmt
。impl Debug for FileChunk {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> {
write!(f, "{:#?}", self)
}
}
1 规范需要大约30个变体,因此手动实现所有变体将非常繁琐,并且还有其他枚举存在相同的问题。