at backyard

Color my life with the chaos of trouble.

Rustの文字列連結について(String)

個人的な備忘録。

+= を用いた文字列の連結

Rustの文字列連結(String)には += が利用できるので、一つのString型の変数に複数回文字列連結を行いたいときなども便利だった。
(なお、ここではパフォーマンス周りについては特に書きません。後日調べてみて追記するかも)

サンプルコードは下記。

fn main() {
    let mut text: String = "aaa".to_string();
    text += "bbb";
    text += "ccc";
    println!("{}", text);
}

これを実行すると、

aaabbbccc

と出力される。

その他の方法

moveすることによる連結

変数の後ろに新たな文字列を追加して代入し直す方法。

fn main() {
    let mut text: String = "aaa".to_string();
    text = text + "bbb";
    text = text + "ccc";
    println!("{}", text);
}

今回のように mutable で宣言している場合は不要だと思うが、例えば下記のような処理の場合は有効。

fn main() {
    let text: String = "aaa".to_string();
    let text2 = text + "bbb";
    let text3 = text2 + "ccc";
    println!("{}", text3);
}

ちなみにこういうことはできない。すでにmoveしてしまっているため、 texttext2 の出力部分でエラーとなる。

fn main() {
    let text: String = "aaa".to_string();
    let text2 = text + "bbb";
    let text3 = text2 + "ccc";
    println!("{}", text);
    println!("{}", text2);
    println!("{}", text3);
}

cloneを用いた連結

clone を使って文字列連結。
今回のようなケースではまず利用することはないかと思われる。

fn main() {
    let mut text: String = "aaa".to_string();
    text = text.clone() + "bbb";
    text = text.clone() + "ccc";
    println!("{}", text);
}

今回はすべて mutable で宣言した text を使いまわしているので不要だが、例えば下記のように複数の変数を使うような場合は利用できる
(moveしている場合はエラーになったが、この場合は利用できる。cloneを使うことで一時的に変数が作られて、その変数がmoveするという流れになっているらしい)

fn main() {
    let text: String = "aaa".to_string();
    let text2 = text.clone() + "bbb";
    let text3 = text2.clone() + "ccc";
    println!("{}", text);
    println!("{}", text2);
    println!("{}", text3);
}