BTreeMap 的自定义调试实现

问题描述 投票:0回答:1

我有以下数据结构:

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()
    }
}
rust formatter
1个回答
3
投票

我会为相反的顺序使用包装器结构,然后只使用

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

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.