簡體   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