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
相关产品推荐
相关产品推荐

