在`fmt::Display`中递归打印结构体

5

我目前正在实现fmt::Display,以使结构体可以在控制台打印输出。但是,该结构体具有一个字段,它是其类型的Vec

结构体

pub struct Node<'a> {
    pub start_tag: &'a str,
    pub end_tag: &'a str,
    pub content: String,
    pub children: Vec<Node<'a>>,
}

当前的fmt::Display(无效)

impl<'a> fmt::Display for Node<'a> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "START TAG: {:?}", self.start_tag);
        write!(f, "CONTENT: {:?}", self.content);
        for node in self.children {
            write!(f, "CHILDREN:\n\t {:?}", node);
        }
        write!(f, "END TAG: {:?}", self.end_tag);
    }
}

期望输出

START TAG: "Hello"
CONTENT: ""
CHILDREN:
   PRINTS CHILDREN WITH INDENT
END TAG: "World"

1
for node in self.childrenfor node in &self.children。同时在每个write周围使用try!() - bluss
2个回答

5

Debug有一个(有点隐藏的)特性,您可以使用格式说明符{:#?}来漂亮地打印您的对象(带缩进和多行)。如果将结构体元素重写为与所请求的输出相同的顺序并派生出Debug trait,则可以使用此功能。

#[derive(Debug)]
pub struct Node<'a> {
    pub start_tag: &'a str,
    pub content: String,
    pub children: Vec<Node<'a>>,
    pub end_tag: &'a str,
}

那么你的输出可以像这样:
Node {
    start_tag: "Hello",
    content: "",
    children: [
        Node {
            start_tag: "Foo",
            content: "",
            children: [],
            end_tag: "Bar"
        }
    ],
    end_tag: "World"
}

PlayPen中试用一下


4
看起来您可能混淆了 DisplayDebug{:?} 使用 Debug 特性进行格式化。您可能没有在类型上实现 Debug,这就是为什么会出现错误的原因。要使用 Display 特性,请在格式字符串中写入 {}
write!(f, "CHILDREN:\n\t {}", node);

1
在语义上,这种类型的输出更有可能适用于 Debug 而不是 Display。顺便提一下。 - Chris Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接