// 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