繁体   English   中英

如何在 Rust 中加入一个字符向量

[英]How do I join a char vector in Rust

我正在做 rustlings 练习,我试过这个来使 function 大写。但是连接部分不起作用。 它说:

“方法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("")
        },
    }
}

你可以只使用as_str()

pub fn capitalize_first(input: &str) -> String {
    let mut c = input.chars();
    match c.next() {
        None => String::new(),
        Some(first) => first.to_uppercase().to_string() + c.as_str(),
    }
}

join方法的返回类型存在char类型不满足的约束,因为它没有 static 生命周期:

pub fn join<Separator>(&self, sep: Separator) -> <Self as Join<Separator>>::Output
    where
        Self: Join<Separator>,
    {
        Join::join(self, sep)
    }

您应该使用String::from_iter代替:

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;
          String::from_iter(v)
      },
  }
}

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

 let my_string = my_char_vec.iter().collect();

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

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

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

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
}

但是当您使用to_ascii_upercase时,还有另一种解决方案。 因为 ASCII 字符在小写和大写中具有相同的字节大小,所以您可以在 UTF8 字符串中就地更改它们:

pub fn capitalize_first(input: &str) -> String {
    let mut string = input.to_string();
    if !string.is_empty() {
        string[..1].make_ascii_uppercase();
    }
    string
}

第二种方法可以用于零分配的可变字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM