rust - Rust打印选项自定义结构

标签 rust

在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()。但是,如果该选项为“无”,则将出现问题。 (其他解包方法是expectmatch,...)
如果使用.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/

相关文章:

file - 使用 BufReader 逐行读取文件,存储到数组中

rust - Inmutable 和 Mutable 在调用 "const"方法时借用 "const"参数

迭代器返回对其自身的引用

rust - 在另一个异步函数中调用异步函数的正确方法是什么?

rust - 带后缀的数字文字,比如 0u8,在 Rust 中意味着什么?

rust - Tokio mpsc 接收器上的非阻塞接收

string - 字符串向量上的连接运算符的等价物是什么?

asynchronous - 即使范围拥有变量的所有权,引用仍被保留而无法使用

rust - 有没有办法让拍手使用文件中的默认值?

rust - 如何使用 Piston 创建全屏窗口?