Rust中判断字符串是否以某一子串集合元素开头的惯用方法
core::str::starts_with函数定义core::str pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where P: Pattern<'a>,如果给定模式匹配此字符串切片的前缀,则返回
true,否则返回false。
模式可以是&str、[char]、[char]切片,或是用于判断字符是否匹配的函数或闭包。
Rust中判断字符串是否以子串集合任意元素开头的惯用方法
处理单个字符前缀时,我们可以用简洁的写法:
if applesauce.starts_with(['a', 'b', 'c', 'd']) { // 仅匹配单个字符时的优雅写法 }
但如果要匹配多字符子串集合,下面这种冗长的写法显然不够优雅:
if applesauce.starts_with("aaa") || applesauce.starts_with("bbb") || applesauce.starts_with("ccc") || applesauce.starts_with("ddd") { // 肯定有更优的写法! }
解决方案
将目标子串集合放到切片中,通过迭代器的any方法简化代码,这是Rust里的惯用写法:
let prefixes = ["aaa", "bbb", "ccc", "ddd"]; if prefixes.iter().any(|&prefix| applesauce.starts_with(prefix)) { // 字符串以集合中任意子串开头时执行逻辑 }
说明
iter()遍历子串切片中的每个元素any()会依次检查每个子串,只要有一个满足starts_with条件就立即返回true(短路求值,无需遍历全部元素)- 写法简洁高效,同时保持了代码可读性
内容的提问来源于stack exchange,提问作者Jack Deeth
相关产品推荐
相关产品推荐

