String

String は、拡張可能な UTF-8 エンコード文字列です:

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

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 のすべてのメソッドを呼び出せます。

  • String::new は新しい空の文字列を返します。文字列に追加したいデータ量が分かっている場合は String::with_capacity を使ってください。
  • String::lenString のサイズをバイト単位で返します(これは文字数としての長さとは異なる場合があります)。
  • String::chars は実際の文字を反復するイテレータを返します。書記素クラスタ により、char は人間が「文字」と見なすものとは異なる場合があることに注意してください。
  • 文字列に言及するとき、それは &str または String のどちらかを指している場合があります。
  • 型が Deref<Target = T> を実装していると、コンパイラによって T のメソッドを透過的に呼び出せるようになります。
    • まだ Deref トレイトについては説明していないので、この時点では主にドキュメントのサイドバーの構造を説明するものです。
    • StringDeref<Target = str> を実装しているため、str のメソッドに透過的にアクセスできます。
    • let s3 = s1.deref();let s3 = &*s1; を書いて比較してみてください。
  • String はバイトベクタを包むラッパーとして実装されており、ベクタでサポートされている多くの操作は String でもサポートされていますが、いくつか追加の保証があります。
  • String にインデックスアクセスするさまざまな方法を比較してください:
    • 文字に対しては、i が範囲内の場合と範囲外の場合で s3.chars().nth(i).unwrap() を使います。
    • 部分文字列に対しては、s3[0..4] を使い、そのスライスが文字境界にある場合とない場合を試します。
  • 多くの型は to_string メソッドで文字列に変換できます。このトレイトは Display を実装するすべての型に対して自動的に実装されるため、フォーマットできるものはすべて文字列にも変換できます。