You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:43:09