如何为具有特征对象成员的结构实现调试特征?

时间:2019-05-28 13:21:16

标签: rust traits

我的目标是打印具有特征对象成员的struct的内容,但是我找不到如何告诉Rust编译器该成员还实现了其他特征,例如DisplayDebug

例如,在下面的程序中,我想打印S2的结构(和进行比较的S1),但是我陷入了fmt的实现中。

trait Tr {}

impl Tr for usize {}

impl Tr for String {}

#[derive(Debug)]
struct S1<A: Tr + std::fmt::Debug> {
    member: Box<A>,
}

struct S2 {
    member: Box<Tr>,
}

impl std::fmt::Debug for S2 {
    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
        // ??
        Ok(())
    }
}

fn main() {
    let s1 = S1 {
        member: Box::new(String::from("abc")),
    };

    println!("{:?}", s1);

    let s2 = S2 {
        member: Box::new(String::from("abc")),
    };

    println!("{:?}", s2);
}

该程序的期望输出是

S1 { member: "abc" }
S2 { member: "abc" }

是否可以为Debug之类的结构实现S2

(锈迹版:1.35)

2 个答案:

答案 0 :(得分:1)

  

是否可以为Debug之类的结构实现S2

是的,Book

中明确指出了这一点

您需要为Debug实现S2特质,如下所示:

trait MyTrait {}
impl MyTrait for usize {}
impl MyTrait for String {}

trait MyTraitWritable: MyTrait + Debug {}
impl MyTraitWritable for usize {}
impl MyTraitWritable for String {}

impl std::fmt::Debug for S2 {
    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
        write!(fmt, "S2 {{ member: {:?} }}", self.member)
    }
}

Playground

答案 1 :(得分:0)

您可以将S2设置为通用类型,但无需指定该类型也应该在那里实现Debug。相反,您可以在impl中指定它:

struct S2<A: Tr> {
    member: Box<A>,
}

impl<A: Tr + std::fmt::Debug> std::fmt::Debug for S2<A> {
    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
        write!(fmt, "S2 {{ member: {:?} }}", self.member)?;
        Ok(())
    }
}

这样,S2将实现Debug(如果实际类型确实如此)。