在 Rust 中,将 &str 拆分为每个包含一个字符的 &strs 迭代器的惯用方法是什么?

5 string generics iterator traits rust

如果我想点&str"aeiou"并将其转换为大致相当于 的迭代器["a", "e", "i", "o", "u"].iter(),那么最惯用的方法是什么?

我试过做"aeiou".split("")这对我来说似乎是惯用的,但我&str在开始和结束时都得到了空的s。

我试过这样做,"aeiou".chars()但从那里试图将chars 变成&strs变得非常丑陋和笨拙。

目前,我只是输入了["a", "e", "i", "o", "u"].iter(),但必须有一种更简单、更惯用的方式。

对于上下文,我最终将遍历每个值并将其传递给类似string.matches(vowel).count().

这是我的整体代码。也许我在别的地方误入歧途了。

fn string_list_item_count<'a, I>(string: &str, list: I) -> usize
where
    I: IntoIterator<Item = &'a str>,
{
    let mut num_instances = 0;

    for item in list {
        num_instances += string.matches(item).count();
    }

    num_instances
}

// snip

string_list_item_count(string, vec!["a", "e", "i", "o", "u"])

// snip
Run Code Online (Sandbox Code Playgroud)

如果我可以在迭代器中string_list_item_count接受std::str::pattern::Patterntrait,我认为这将使这个函数接受&strand 的迭代器char,但Patterntrait 是一个夜间不稳定的 API,我试图避免使用它们。

ssh*_*124 5

您可以使用split_terminator而不是split跳过迭代器末尾的空字符串。此外,如果你skip是迭代器的第一个元素,你会得到你想要的结果:

let iterator = "aeiou".split_terminator("").skip(1);
println!("{:?}", iterator.collect::<Vec<_>>());
Run Code Online (Sandbox Code Playgroud)

输出:

["a", "e", "i", "o", "u"]
Run Code Online (Sandbox Code Playgroud)