如何在fmt::Display模式匹配中为特定枚举值跳过write!调用?
如何在枚举的
fmt::Display实现中跳过特定值的write!调用? 当然可以实现类似“跳过”特定枚举值输出的效果,不过得注意fmt::Display的fmt方法要求所有分支都返回fmt::Result类型,不能直接空着不处理。下面给你两种可行的方案:
方案一:直接返回成功结果Ok(())
你可以在C的分支里直接返回Ok(()),这表示格式化操作成功完成,但没有向输出流写入任何内容,完美达到“跳过”的效果:
impl fmt::Display for SomeEnum { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { use SomeEnum::*; match *self { A => write!(f, "A"), B => write!(f, "B"), C => Ok(()), // 不调用write!,直接返回成功,无输出 } } }
方案二:写入空字符串
另一种等价的方式是调用write!但写入空字符串,效果和上面完全一样,只是写法不同:
impl fmt::Display for SomeEnum { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { use SomeEnum::*; match *self { A => write!(f, "A"), B => write!(f, "B"), C => write!(f, ""), // 写入空内容,等同于跳过输出 } } }
需要注意的是,不能让C的分支没有返回值,Rust的match表达式要求所有分支返回相同类型,而fmt方法的返回值固定是fmt::Result,所以上面两种方式都是符合要求的合法实现,都能实现你想要的“不为C调用write!(或等价的无输出)”的需求。
内容的提问来源于stack exchange,提问作者Daniel Ribeiro
相关产品推荐
相关产品推荐

