我有以下数据结构:
struct Foo {
a: BTreeMap<i32, i32>,
b: BTreeMap<i32, i32>,
}
当我将它打印到标准输出时,我想以增加的方向显示
a
字段,以减少的方向显示 b
字段。
我真的无法从
Display
文档中看到如何做到这一点。也许 debug_map 助手会有用?但是看完示例后我无法理解如何使用它。
我已经做到了这一点,但看不到如何将它与一些自定义的东西组合起来,比如
"a: \n"
和 "b: \n"
.
impl fmt::Debug for Foo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_map()
.entries(self.a.iter().map(|(k, v)| (k, v)))
.entries(self.b.iter().rev().map(|(k, v)| (k, v)))
.finish()
}
}
我会为相反的顺序使用包装器结构,然后只使用
debug_struct
代替:
impl fmt::Debug for Foo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
struct BTreeMapReversed<'a>(&'a BTreeMap<i32, i32>);
impl fmt::Debug for BTreeMapReversed<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_map()
.entries(self.0.iter().rev())
.finish()
}
}
f.debug_struct("Foo")
.field("a", &self.a)
.field("b", &BTreeMapReversed(&self.b))
.finish()
}
}
输出:
[src/main.rs:33] foo = Foo {
a: {
1: 2,
3: 4,
},
b: {
7: 8,
5: 6,
},
}