如何为具有特征对象成员的结构实现调试特征?
How to implement the Debug trait for struct that has a trait object member?
我的目标是打印具有特征对象成员的结构的内容,但我找不到如何告诉 Rust 编译器该成员还实现了其他特征,如 Display
或 Debug
。
例如,在下面的程序中,我想打印 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" }
是否可以为 S2
这样的结构实现 Debug
?
(铁锈版本:1.35)
您可以使 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
如果实际类型确实如此。
Is it possible to implement Debug
for a struct like S2
?
可以,Book
中明确指出了这一点
您需要为您的 S2
实施 Debug
特征,如下所示:
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)
}
}
我的目标是打印具有特征对象成员的结构的内容,但我找不到如何告诉 Rust 编译器该成员还实现了其他特征,如 Display
或 Debug
。
例如,在下面的程序中,我想打印 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" }
是否可以为 S2
这样的结构实现 Debug
?
(铁锈版本:1.35)
您可以使 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
如果实际类型确实如此。
Is it possible to implement
Debug
for a struct likeS2
?
可以,Book
中明确指出了这一点您需要为您的 S2
实施 Debug
特征,如下所示:
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)
}
}