在rust中,我希望在impl fmt::Display for MainStruct
中能够打印另一个结构。
#[derive(Clone, Default)]
pub struct MainStruct {
pub child: Option<ChildStruct>
}
#[derive(Clone, Default)]
pub struct ChildStruct {
pub field: String
}
impl std::fmt::Display for MainStruct {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "MainStruct: child:{}", self.child)
}
}
impl std::fmt::Display for ChildStruct {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "ChildStruct: field:{}", self.field)
}
}
我尝试使用默认的{}
格式化程序和{:?}
格式化程序,但没有成功。
最佳答案
问题在于Option<T>
尚未实现Display
特性。因此,您必须从选项中获取值(value)。最简单的方法是.unwrap()
。但是,如果该选项为“无”,则将出现问题。 (其他解包方法是expect
,match
,...)
如果使用.unwrap()
,则该值将从Option中移出。由于该选项不再包含任何内容,因此该选项现在将无效。编译器使用cannot move out of 'self.child'
错误来防止这种情况。
因此,您真正想要的是一个不会消耗 child 的引用。因此,您需要从Option中获得&T
或&mut T
。您可以通过使用.as_ref()
将Option<T>
转换为Option<&T>
来实现。然后,如果对它执行.unwrap()
,则编译器将不再提示,因为您只需复制&T
指针即可。
因此,如果更改以下内容,则会编译代码:
impl std::fmt::Display for MainStruct {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "MainStruct: child:{}", self.child.as_ref().unwrap())
}
}
关于rust - Rust打印选项自定义结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64590548/