在`fmt :: Display`中递归打印struct

XAM*_*cky 4 console struct println rust

我目前正在实现fmt::Display一个结构,以便它将打印到控制台.然而,struct有一个字段,它是Vec它的类型.

结构

pub struct Node<'a> {
    pub start_tag: &'a str,
    pub end_tag: &'a str,
    pub content: String,
    pub children: Vec<Node<'a>>,
}
Run Code Online (Sandbox Code Playgroud)

当前fmt ::显示(无效)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

期望的输出

START TAG: "Hello"
CONTENT: ""
CHILDREN:
   PRINTS CHILDREN WITH INDENT
END TAG: "World"
Run Code Online (Sandbox Code Playgroud)

oli*_*obk 5

有一个(有点隐藏)的功能Debug,你可以使用格式说明符{:#?}来漂亮你的对象(使用缩进和多行).如果您将struct的元素重写为与请求的输出具有相同的顺序并导出Debug特征

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

那么你的输出可能如下所示:

Node {
    start_tag: "Hello",
    content: "",
    children: [
        Node {
            start_tag: "Foo",
            content: "",
            children: [],
            end_tag: "Bar"
        }
    ],
    end_tag: "World"
}
Run Code Online (Sandbox Code Playgroud)

PlayPen中试一试