web-dev-qa-db-ja.com

文字列を連結するにはどうすればよいですか?

次のタイプの組み合わせを連結するにはどうすればよいですか:

  • strおよびstr
  • Stringおよびstr
  • StringおよびString
117
jsalter

文字列を連結するとき、結果を保存するためにメモリを割り当てる必要があります。開始するのが最も簡単なのはString&strです。

fn main() {
    let mut owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    owned_string.Push_str(borrowed_string);
    println!("{}", owned_string);
}

ここには、変更可能な所有文字列があります。メモリ割り当てを再利用できる可能性があるため、これは効率的です。 StringStringについても、&String&strとして逆参照できます のようなケースがあります。

fn main() {
    let mut owned_string: String = "hello ".to_owned();
    let another_owned_string: String = "world".to_owned();

    owned_string.Push_str(&another_owned_string);
    println!("{}", owned_string);
}

この後、another_owned_stringは変更されません(mut修飾子がないことに注意してください)。 String消費するが、可変である必要がない別のバリアントがあります。これは Add特性の実装 で、左側にStringを、右側に&strを取ります。

fn main() {
    let owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    let new_owned_string = owned_string + borrowed_string;
    println!("{}", new_owned_string);
}

owned_stringは、+の呼び出し後にアクセスできなくなることに注意してください。

両方の文字列をそのままにして、新しい文字列を作成したい場合はどうしますか?最も簡単な方法は format! を使用することです:

fn main() {
    let borrowed_string: &str = "hello ";
    let another_borrowed_string: &str = "world";

    let together = format!("{}{}", borrowed_string, another_borrowed_string);
    println!("{}", together);
}

両方の入力変数は不変であることに注意してください。したがって、それらは変更されないことがわかります。 Stringの任意の組み合わせに対して同じことをしたい場合は、Stringもフォーマットできるという事実を使用できます。

fn main() {
    let owned_string: String = "hello ".to_owned();
    let another_owned_string: String = "world".to_owned();

    let together = format!("{}{}", owned_string, another_owned_string);
    println!("{}", together);
}

ただし、format!を使用するhaveはありません。 1つの文字列を複製 し、新しい文字列に他の文字列を追加できます。

fn main() {
    let owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    let together = owned_string.clone() + borrowed_string;
    println!("{}", together);
}

-私がやった型指定はすべて冗長です-コンパイラはここですべての型を推測できます。この質問はそのグループで人気があると思うので、Rustを初めて使用する人にはわかりやすいように追加しました。

148
Shepmaster

複数の文字列を別の文字で区切られた単一の文字列に連結するには、いくつかの方法があります。

私が見た中で一番いいのは、配列でjoinメソッドを使用することです:

fn main() {
    let a = "Hello";
    let b = "world";
    let result = [a, b].join("\n");

    print!("{}", result);
}

ユースケースに応じて、より細かく制御することもできます。

fn main() {
    let a = "Hello";
    let b = "world";
    let result = format!("{}\n{}", a, b);

    print!("{}", result);
}

私が見たいくつかの手動の方法があり、あちこちで1つまたは2つの割り当てを回避する方法もあります。読みやすくするために、上記の2つで十分であることがわかりました。

30
Simon Whitehead

concat methodと+もここに記載する必要があると思います:

assert_eq!(
  ("My".to_owned() + " " + "string"),
  ["My", " ", "string"].concat()
);

また、 concat! マクロもありますが、リテラルのみです:

let s = concat!("test", 10, 'b', true);
assert_eq!(s, "test10btrue");
2
suside