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 12

  1. 辞書unwrap
  2. 辞書クローン
  3. 辞書コンソール出力
  4. 辞書ベクタ(Vec)
  5. 辞書ムーブ
  6. 辞書関連関数
  7. 辞書所有権
  8. 辞書標準ライブラリ
  9. 辞書文字列スライス
  10. 辞書文字列リテラル
  11. 動かして学ぶRustプログラミング問題集 › 第6章 文字列とベクタ
  12. 動かして学ぶRustプログラミング問題集 › 第7章 所有権とムーブ