Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

  1. トップページ
  2. Rust辞典
  3. String::push_str() / push() / +

String::push_str() / push() / +

Rustのstring型への文字列追加には『push_str()』(文字列の追記)・『push()』(1文字の追加)・『+』演算子・『format!()』マクロなどを使います。それぞれ所有権の扱いが異なります。

構文
let mut s = String::from("Hello");

// &str を末尾に追加します(所有権は移動しません)。
s.push_str(", World");   // s = "Hello, World"

// 1文字(char型)を末尾に追加します。
s.push('!');             // s = "Hello, World!"

// + 演算子:左辺の所有権を消費して結合します。
let s1 = String::from("Hello");
let s2 = String::from(", World");
let s3 = s1 + &s2;  // s1 の所有権が移動します。s2 は借用です。
// ここで s1 は使えません。s3 = "Hello, World"

// format! マクロ:すべての所有権を保持したまま結合します。
let s4 = format!("{}-{}-{}", "Hello", "World", "Rust");
メソッド一覧
メソッド/構文概要
s.push_str(str)&str を末尾に追加します。所有権は移動しません。
s.push(char)char 1文字を末尾に追加します。
s1 + &s2s1(所有権ムーブ)と s2(借用)を結合します。
format!("{}{}", s1, s2)所有権を保持したまま複数の文字列を結合します。
s.extend(iter)イテレータの要素を文字列に追加します。
s.repeat(n)文字列をn回繰り返した新しいStringを返します。
s.insert(idx, char)バイトインデックスidxにcharを挿入します。
s.insert_str(idx, str)バイトインデックスidxに&strを挿入します。
サンプルコード
fn main() {
    // push_str:文字列の追加です(mutableにする必要があります)。
    let mut s = String::from("Hello");
    s.push_str(", Rust");
    s.push('!');
    println!("push_str + push: {}", s);

    // + 演算子での結合(所有権に注意)です。
    let s1 = String::from("Hello");
    let s2 = String::from(", World");
    let s3 = s1 + &s2;   // s1の所有権が消費されます。
    // println!("{}", s1);  // ← エラー!s1は使えません。
    println!("+ 演算子: {}", s3);

    // 複数結合は + が読みにくくなります。
    let s4 = String::from("tic");
    let s5 = String::from("tac");
    let s6 = String::from("toe");
    // s4 + &s5 + &s6 は読みにくいためformat!を推奨します。
    let s7 = format!("{}-{}-{}", s4, s5, s6);  // 所有権は移動しません。
    println!("format!: {}", s7);
    println!("s4: {}", s4);  // format!なら所有権が保持されています。

    // extend でイテレータから追加します。
    let mut s = String::from("Hello");
    s.extend([',', ' ', 'R', 'u', 's', 't']);
    println!("extend: {}", s);

    // repeat で繰り返します。
    let repeated = "ha".repeat(3);
    println!("repeat: {}", repeated);  // hahaha

    // insert / insert_str で途中に挿入します。
    let mut s = String::from("Hello!");
    s.insert(5, ',');           // インデックス5にカンマを挿入します。
    s.insert_str(6, " World");  // インデックス6に文字列を挿入します。
    println!("insert: {}", s);  // Hello, World!

    // よくあるパターン:文字列の構築です。
    let parts = ["apple", "banana", "cherry"];
    let mut result = String::new();
    for (i, part) in parts.iter().enumerate() {
        if i > 0 {
            result.push_str(", ");
        }
        result.push_str(part);
    }
    println!("結合結果: {}", result);
}
概要

文字列結合の方法を選ぶ際の指針です。複数の文字列を読みやすく結合するなら『format!()』が最適です。ループで少しずつ追加するなら『push_str()』を使います。パフォーマンスが重要な場合は最初に『String::with_capacity()』でメモリを確保しておくと再アロケーションを避けられます。

+ 演算子は左辺のStringの所有権を消費します。後で左辺を使う予定がある場合はformat!()を使ってください。

Stringの生成方法は『String::from() / to_string()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。