Rust高效构建String的方法及元音移除函数写法优化咨询
字符追加优化
你对to_string()写法的疑问是完全正确的,这种写法会为每个字符额外生成临时String对象,带来不必要的性能开销。Rust的String类型原生提供push()方法,直接接收char类型参数即可完成字符追加,不需要额外做类型转换:
no_vowels.push(c);
另外你不需要修改遍历逻辑:Rust的String是UTF-8编码的字节序列,直接按长度遍历字节会无法处理多字节的Unicode字符,使用chars()迭代器遍历字符是标准的合规实现,没有问题。
返回值写法优化
你的代码里的return语句不是必需的。Rust惯例是函数最后一个没有分号的表达式会自动作为返回值,你直接把最后一行的return no_vowels;改成no_vowels就符合惯例了。
修改后的常规实现版本如下:
fn remove_vowels(s: String) -> String { let mut no_vowels = String::new(); for c in s.chars() { if !['a', 'e', 'i', 'o', 'u'].contains(&c) { no_vowels.push(c); } } no_vowels }
更地道的Rust实现
你还可以用迭代器 + 函数式写法进一步简化代码,不需要手动声明可变的中间String变量:
fn remove_vowels(s: String) -> String { s.chars() .filter(|c| !['a', 'e', 'i', 'o', 'u'].contains(c)) .collect() }
这里的filter会过滤掉所有元音字符,最后调用collect()方法时,Rust会根据函数返回值类型自动把迭代器中的字符组装成新的String,这是业内更常用的写法。
如果需要同时过滤大写元音,可以在判断时统一转成小写:
.filter(|c| !['a', 'e', 'i', 'o', 'u'].contains(&c.to_ascii_lowercase()))
内容的提问来源于stack exchange,提问作者jts
相关产品推荐
相关产品推荐

