如何将字符串拆分为第一个字符和其余部分?

4

这是我当前的代码:

fn split_first_char(s: &str) -> Option<(char, &str)> {
    let mut char_indices = s.char_indices();
    let (_, c) = char_indices.next()?;
    let i = match char_indices.next() {
        Some((i, _)) => i,
        None => s.len(),
    };
    Some((c, s.split_at(i).1))
}

有更简单或内置的方法来完成相同的任务吗?
3个回答

8
我发现一个更加优雅的解决方案:
fn split_first_char(s: &str) -> Option<(char, &str)> {
    let mut chars = s.chars();
    match chars.next() {
        Some(c) => Some((c, chars.as_str())),
        None => None,
    }
}

或者

fn split_first_char(s: &str) -> Option<(char, &str)> {
    let mut chars = s.chars();
    chars.next().map(|c| (c, chars.as_str()))
}

4

我不这样认为,但你可以使这个更短:

fn split_first_char(s: &str) -> Option<(char, &str)> {
    s.chars().next().map(|c| (c, &s[c.len_utf8()..]))
}

0

从Rust 1.50版本开始,您可以使用split_first()函数。

"My String".chars().collect::<Vec<char>>().split_first();

这将导致:

Option<(&char, &[char])>

虽然类型不完全是Option<(char, &str)>,但它可能足够接近你所寻找的。

那个方法是针对 [T] 的,而不是所要求的 str - Filipe Rodrigues
我通过一个例子进行了澄清。谢谢。 - Sheldon
你的代码在字符串的长度上是线性的,将所有字符收集到一个向量中,然后只取第一个字符。这可能可以进行优化,但你真的不想去考虑这个。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接