String

String 是標準堆積配置的可成長 UTF-8 字串緩衝區:

fn main() {
    let mut s1 = String::new();
    s1.push_str("Hello");
    println!("s1: len = {}, capacity = {}", s1.len(), s1.capacity());

    let mut s2 = String::with_capacity(s1.len() + 1);
    s2.push_str(&s1);
    s2.push('!');
    println!("s2: len = {}, capacity = {}", s2.len(), s2.capacity());

    let s3 = String::from("🇨🇭");
    println!("s3: len = {}, number of chars = {}", s3.len(), s3.chars().count());
}

String 會實作 Deref<Target = str>。也就是說,您可以在 String 上呼叫所有 str 方法。

This slide should take about 10 minutes.
  • String::new 會傳回新的空白字串,如果您知道要向字串推送多少資料,請使用 String::with_capacity
  • String::len 會傳回 String 的大小 (以位元組為單位,可能與以字元為單位的長度不同)。
  • String::chars 會傳回實際字元的疊代器。請注意,由於字形叢集的關係,char 和一般人所認為的「字元」可能不同。
  • 提到字串時,一般人可能是指 &strString
  • 當型別實作 Deref<Target = T> 時,編譯器可讓您以公開透明的方式呼叫 T 中的方法。
    • 我們尚未討論 Deref 特徵,因此目前主要會講解說明文件中的側欄結構。
    • String 會實作 Deref<Target = str>,後者能以公開透明的方式授予前者 str 方法的存取權。
    • Write and compare let s3 = s1.deref(); and let s3 = &*s1;.
  • String 是以包裝函式的形式在位元組向量的四周實作,許多在向量上支援的作業也適用於 String,但需要某些額外保證。
  • 請比較各種為 String 建立索引的方法:
    • 使用 s3.chars().nth(i).unwrap() 變為字元,其中 i 代表是否出界。
    • 使用 s3[0..4] 變為子字串,其中該切片會位於字元邊界上,也可能不會。
  • Many types can be converted to a string with the to_string method. This trait is automatically implemented for all types that implement Display, so anything that can be formatted can also be converted to a string.