Rust中如何简洁判断字符串是否以元音字符开头?
解决Rust中判断字符串是否以元音开头的简洁写法问题
错误原因
你遇到的编译错误是因为vowels.iter()返回的是&char类型的迭代器,而str::starts_with方法要求参数实现Pattern trait,&char并没有实现该 trait,因此无法直接传入。
几种简洁的正确写法
写法一:直接检查首字符是否在元音集合中(推荐,更高效)
既然只需要判断单字符前缀,直接提取字符串的第一个字符,再检查是否属于元音数组即可:
let s = String::from("apple"); let vowels = ['a', 'e', 'i', 'o', 'u']; if s.chars().next().map_or(false, |c| vowels.contains(&c)) { println!("{} begins with a vowel.", s); }
s.chars().next()获取字符串的第一个UTF-8字符(你明确是ASCII场景,无需担心多字节问题)map_or(false, ...)处理字符串为空的情况,此时返回falsevowels.contains(&c)检查字符是否在元音数组中
写法二:将char转为&str适配starts_with
如果坚持使用iter().any()的写法,需要把&char转为&str类型(&str实现了Pattern trait):
let s = String::from("apple"); let vowels = ['a', 'e', 'i', 'o', 'u']; if vowels.iter().any(|&v| s.starts_with(&v.to_string())) { println!("{} begins with a vowel.", s); }
通过v.to_string()把char转为String,再取其引用作为starts_with的参数。
写法三:使用字符串切片数组定义元音
直接将元音定义为字符串切片数组,可直接传入starts_with:
let s = String::from("apple"); let vowels = ["a", "e", "i", "o", "u"]; if vowels.iter().any(|&v| s.starts_with(v)) { println!("{} begins with a vowel.", s); }
这种写法避免了char转str的步骤,代码更简洁。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

