String

String is a growable UTF-8 encoded string:

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());
}

StringDeref<Target = str> を実装します。つまり、String のすべての str メソッドを呼び出すことができます。

This slide should take about 5 minutes.
  • String::new は新しい空の文字列を返します。文字列にプッシュするデータの量がわかっている場合は String::with_capacity を使用します。
  • String::len は、String のサイズをバイト単位で返します(文字数とは異なる場合があります)。
  • String::chars は、実際の文字のイテレータを返します。書記素クラスタにより、char は人間が「文字」と見なすものとは異なる場合があります。
  • 人々が文字列について言及する場合、単に &str または String のことを話している可能性があります。
  • 型が Deref<Target = T> を実装している場合、コンパイラにより T からメソッドを透過的に呼び出せるようになります。
    • Deref トレイトについてはまだ説明していないため、現時点では主にドキュメントのサイドバーの構造について説明しています。
    • StringDeref<Target = str> を実装し、str のメソッドへのアクセスを透過的に許可します。
    • let s3 = s1.deref();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.