在 Rust 中构建新字符串的有效方法

jts*_*jts 0 string character rust borrow-checker

我最近刚刚开始学习 Rust,并且一直在摆弄一些代码。我想创建一个简单的函数,从字符串中删除元音并返回一个新字符串。下面的代码可以运行,但我担心这是否真的是这种语言中有效的、典型的方法,或者我是否遗漏了一些东西......

// remove vowels by building a String using .contains() on a vowel array
fn remove_vowels(s: String) -> String {
    let mut no_vowels: String = String::new();
    for c in s.chars() {
        if !['a', 'e', 'i', 'o', 'u'].contains(&c) {
            no_vowels += &c.to_string();
        }
    }
    return no_vowels;
}
Run Code Online (Sandbox Code Playgroud)

首先,使用to_string()构造一个新的字符串,然后使用&借用似乎不太合适。是否有更简单的方法将字符附加到字符串,或者这是唯一的方法?或者我应该完全重写它并使用循环按其长度而不是按字符数组迭代输入的字符串?

另外,我还得知,Rust 中很流行不使用 return 语句,而是让最后一个表达式从函数返回值。这里是否需要我的返回语句,或者是否有更干净的方法来返回遵循约定的值?

kmd*_*eko 10

如果您像示例一样使用原始字符串String,则可以使用 就地删除元音retain(),这将避免分配新字符串:

fn remove_vowels(mut s: String) -> String {
    s.retain(|c| !['a', 'e', 'i', 'o', 'u'].contains(&c));
    s
}
Run Code Online (Sandbox Code Playgroud)

看到它在操场上工作。旁注:您可能还需要考虑大写元音。