【问题标题】:Implement fmt::Display for Vec<T>为 Vec<T> 实现 fmt::Display
【发布时间】:2015-06-04 00:42:52
【问题描述】:

我想为我的代码中常用的嵌套结构实现fmt::Display

// The root structure
pub struct WhisperFile<'a> {
    pub path: &'a str,
    pub handle: RefCell<File>,
    pub header: Header
}

pub struct Header{
    pub metadata: metadata::Metadata,
    pub archive_infos: Vec<archive_info::ArchiveInfo>
}

pub struct Metadata {
   // SNIP
}

pub struct ArchiveInfo {
   // SNIP
}

如您所见,这是一个重要的数据树。 Header 上的 archive_infos 属性在显示为一行时可能会很长。

我想发出一些类似的东西

WhisperFile ({PATH})
  Metadata
    ...
  ArchiveInfo (0)
    ...
  ArchiveInfo (N)
    ...

但是当我尝试显示 Vec&lt;ArchiveInfo&gt; 时,我发现 Display 没有实现。我可以为ArchiveInfo 实现fmt::Display,但这还不够,因为没有为父容器Vec 实现fmt::Display。如果我为collections::vec::Vec&lt;ArchiveInfo&gt; 实现 fmt::Display 我得到the impl does not reference any types defined in this crate; only traits defined in the current crate can be implemented for arbitrary types

我已尝试遍历 vec 并调用 write!(),但我无法弄清楚控制流应该是什么样子。我认为write!() 需要作为函数的返回值,但会因多次调用而崩溃。

如何漂亮地打印我的结构的 Vec?

【问题讨论】:

    标签: printf rust traits


    【解决方案1】:

    正如此错误所述,您无法为不属于您的类型实现特征:

    impl 没有引用此 crate 中定义的任何类型;只有当前 crate 中定义的特征才能实现任意类型

    但是,您可以为您的包装器类型实现Display。您缺少的部分是使用try! 宏或try 运算符?

    use std::fmt;
    
    struct Foo(Vec<u8>);
    
    impl fmt::Display for Foo {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
            write!(f, "Values:\n")?;
            for v in &self.0 {
                write!(f, "\t{}", v)?;
            }
            Ok(())
        }
    }
    
    fn main() {
        let f = Foo(vec![42]);
        println!("{}", f);
    }
    

    【讨论】:

    • impl 没有引用此 crate 中定义的任何类型 => 不过,在这种情况下,措辞令人困惑; Vec&lt;ArchiveInfo&gt; 毕竟确实引用了这个 crate 中定义的类型。
    • 我不熟悉&amp;self.0 位。看起来你的结构是位置的,所以我想它会进行位置查找?
    • @xrl 哦,是的,对不起。你可以有一个tuple struct,其中结构成员是匿名的,但在位置上可用(.0.1,...)。当它是单个成员时,它被称为 newtype,这是一种将您自己的语义包装在现有类型周围的好方法。
    • 一个无关紧要的问题,struct Foo(Vec);这个(括号的)语法是什么?
    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 2015-05-23
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多