如何在 Rust 中加入 char 向量

Gab*_*ado 4 string iterator char rust

我正在做沙沙声练习,我尝试用这个来制作大写函数。但连接部分不起作用。它说:

“该方法join存在于 struct Vec<char>,但不满足其特征边界,不满足以下特征边界: <[char] as Join<_>>::Output = _

我不知道这意味着什么。连接 char 向量的正确方法是什么?

pub fn capitalize_first(input: &str) -> String {
    let mut c = input.chars();
    match c.next() {
        None => String::new(),
        Some(first) => {
            let upper = first.to_ascii_uppercase();
            let mut v = c.collect::<Vec<char>>();
            v[0] = upper;
            v.join("")
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 8

要回答您的问题,从 chars vec 获取字符串的最佳方法是迭代并收集:

 let my_string = my_char_vec.iter().collect();
Run Code Online (Sandbox Code Playgroud)

但是您的代码中还存在其他问题:

  1. 您使用第一个字符来检查字符串是否为空,然后从迭代的其余部分构建一个字符串,然后使第一个字符替换该字符串的第一个字符...丢失这个字符,这是初始 str 的第二个
  2. 你正在构建一个无用的 vec 并再次迭代。这些是您不需要的昂贵步骤

您可以通过调整代码以直接将迭代写入字符串来解决这些问题:

 let my_string = my_char_vec.iter().collect();
Run Code Online (Sandbox Code Playgroud)

请注意,您正在使用专用于 ASCII 字符的函数。当您确定只处理 ASCII 时,这很好,但如果您想要在国际环境中工作的东西,则需要使用更通用的to_uppercase. 由于unicode大写字符可能是多个字符,因此代码稍微复杂一些:

pub fn capitalize_first(input: &str) -> String {
    let mut chars = input.chars();
    let mut string = String::new();
    if let Some(first) = chars.next() {
        string.push(first.to_ascii_uppercase());
        for c in chars {
            string.push(c);
        }
    }
    string
}
Run Code Online (Sandbox Code Playgroud)

如果您确定可以使用to_ascii_upercase,那么还有另一种解决方案。由于 ASCII 字符只是小写和大写的一个字节,因此您可以在 UTF8 字符串中就地更改它们:

pub fn capitalize_first(input: &str) -> String {
    let mut chars = input.chars();
    let mut string = String::new();
    if let Some(first) = chars.next() {
        let first = first.to_uppercase();
        for c in first {
            string.push(c);
        }
        for c in chars {
            string.push(c);
        }
    }
    string
}
Run Code Online (Sandbox Code Playgroud)

第二种方法可用于零分配的可变字符串。但如果第一个字符不是一个字节长,它就会出现恐慌。