Progrust Library.

// dictionary

文字列型.

文字列型Stringは、内容の追加・変更ができるUTF-8の文字列型です。文字列データをヒープ領域に確保し、実行時に自由に伸長できます。コンパイル時に内容が固定される文字列リテラルと違い、ユーザー入力や計算結果など実行時に決まる文字列を扱えます。プリミティブ型ではなく、標準ライブラリが提供する型です。

fn main() {
    let mut order = String::from("注文: コーヒー");
    order.push_str(" ×2"); // 文字列を末尾に追加
    let total = format!("{order}(合計 900円)");
    println!("{total}");
}
Playgroundで開く

生成方法

よく使う作り方は次のとおりです。

書き方 説明
String::new() 空のStringを作る(あとから追加していく用途)
String::from("...") リテラルからStringを作る
"...".to_string() String::fromと同じ結果。メソッドチェーンに馴染む書き方
format!("こんにちは、{name}さん") 変数を埋め込んだ文字列を組み立てる

変更方法

内容を変更するには、変数をlet mutで可変として宣言しておく必要があります。

書き方 説明
s.push_str("...") 文字列を末尾に追加する
s.push('あ') 文字を1つ末尾に追加する
s1 + &s2 連結した新しい文字列Stringを作る
左辺s1の所有権が移動するため使えなくなる
s.clear() 内容を空にする

&strとの使い分け

Stringは文字列データの所有権を持つ(所有する)型、文字列スライスへの参照&strは既存のデータを借用する型です。

型 内容の変更 主な用途
String できる 実行時に組み立てる文字列の保持
&str できない 関数の引数など読み取り中心の受け渡し

補足

内部表現と添字アクセス

Stringは「データへのポインタ・長さ・容量」の3つの値からなり、実装上はバイト列を保持するベクタ(Vec)(Vec<u8>)のラッパーです(The Rust Programming Language, 8.2章)。中身が常に有効なUTF-8であると保証される点がVec<u8>との違いで、容量を超えて追加すると、より大きな領域を確保し直して自動で伸長します(std公式ドキュメント, String)。

また、文字列変数sに対してs[0]のように整数の添字で1文字を取り出すことはできません。UTF-8では文字ごとにバイト数が異なり、添字の位置が「何文字目か」と一致しないためです(範囲指定&s[a..b]によるバイト位置での切り出しは可能です)。文字単位で処理したい場合はchars()メソッドで文字型(Unicodeスカラー値)の並びとして取り出しますが、結合文字などではchar1個と見た目の1文字が一致しない場合があります。

この辞書が使われているページ

backlinks 18

  1. 辞書Copyトレイト
  2. 辞書Debugトレイト
  3. 辞書Defaultトレイト
  4. 辞書Displayトレイト
  5. 辞書unwrap
  6. 辞書クローン
  7. 辞書コンソール出力
  8. 辞書ベクタ(Vec)
  9. 辞書ムーブ
  10. 辞書演算子オーバーロード
  11. 辞書関連関数
  12. 辞書所有権
  13. 辞書比較演算子
  14. 辞書標準ライブラリ
  15. 辞書文字列スライス
  16. 辞書文字列リテラル
  17. 本動かして学ぶRustプログラミング問題集 › 第6章 文字列とベクタ
  18. 本動かして学ぶRustプログラミング問題集 › 第7章 所有権とムーブ