将格式参数应用于Display实现中的结构成员



我想将格式参数(例如,限制位数(应用于结构的成员。我目前的实现大致如下:

use std::fmt;
#[derive(Debug)]
pub struct Vec2 { x: f32, y: f32 }
impl fmt::Display for Vec2 {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "[{}, {}]", self.x, self.y)
}
}

如果我使用自动派生的调试打印,例如{:.2?},则应用参数,并且只打印小数点后的2位。尽管使用了{:.2},但这似乎不适用于我的Display实现。我试图查看使用cargo expand的Debug实现,但有许多函数是专门针对Debug的。

最简单的方法是转发格式:

impl fmt::Display for Vec2 {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("[")?;
fmt::Display::fmt(&self.x, f)?;
f.write_str(", ")?;
fmt::Display::fmt(&self.y, f)?;
f.write_str("]")
}
}

请注意,如果您希望拥有所有格式说明符,则必须实现其他特性。对于浮点,它只有std::fmt::LowerExpstd::fmt::UpperExp。你可以制作一个不重复代码的小助手功能:

impl Vec2 {
fn fmt(
&self,
f: &mut fmt::Formatter<'_>,
fmt_fn: fn(&f32, f: &mut fmt::Formatter<'_>) -> fmt::Result,
) -> fmt::Result {
f.write_str("[")?;
fmt_fn(&self.x, f)?;
f.write_str(", ")?;
fmt_fn(&self.y, f)?;
f.write_str("]")
}
}
impl fmt::Display for Vec2 {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.fmt(f, fmt::Display::fmt)
}
}
impl fmt::LowerExp for Vec2 {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.fmt(f, fmt::LowerExp::fmt)
}
}
impl fmt::UpperExp for Vec2 {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.fmt(f, fmt::UpperExp::fmt)
}
}

最新更新