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

Rust中如何检查&str是否包含枚举变体对应的字符串?

方案1:无第三方依赖的极简实现

你可以给枚举封装统一的判断方法,一次性维护所有变体的字符串列表,后续调用无需重复写判断逻辑:

enum List {
    Rather,
    Long,
    List,
    Of,
    Items,
}

impl List {
    /// 返回所有枚举变体对应的字面量字符串
    const fn all_variants() -> &'static [&'static str] {
        &["Rather", "Long", "List", "Of", "Items"]
    }

    /// 判断输入字符串是否包含任意一个枚举变体的字面量
    pub fn exists_in(s: &str) -> bool {
        Self::all_variants().iter().any(|v| s.contains(v))
    }
}

调用方式非常简洁:

let a = "InMyList";
let b = "InMyRather";
let c = "NotContain";

assert!(List::exists_in(a));
assert!(List::exists_in(b));
assert!(!List::exists_in(c));

方案2:减少样板代码的派生宏实现

如果不想手动维护变体列表,可以引入第三方库strum,通过派生宏自动生成变体迭代能力,避免手动同步枚举和字符串列表:

use strum::{Display, EnumIter};

#[derive(Display, EnumIter)]
enum List {
    Rather,
    Long,
    List,
    Of,
    Items,
}

impl List {
    pub fn exists_in(s: &str) -> bool {
        use strum::IntoEnumIterator;
        Self::iter().any(|v| s.contains(v.to_string()))
    }
}

方案3:多变体场景下的高性能实现

如果枚举变体数量非常多,想要进一步提升匹配效率,可以预先把所有变体编译为正则表达式,单次遍历字符串即可完成所有匹配,性能远高于多次逐个判断:

use regex::Regex;
use once_cell::sync::Lazy;

// 全局静态正则,仅初始化一次
static LIST_MATCHER: Lazy<Regex> = Lazy::new(|| {
    // 变体有正则特殊字符的话,需要先调用regex::escape转义
    Regex::new(r"Rather|Long|List|Of|Items").unwrap()
});

// 调用方式
assert!(LIST_MATCHER.is_match("InMyList"));

内容的提问来源于stack exchange,提问作者ohboy21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 14:21:03