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


199

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

  • str そして str
  • String そして str
  • String そして String

14
なおstr&strされているさまざまな種類や時間の99%を、あなたが唯一気にすべきです&str。それらの違いを詳述する他の質問があります。
Shepmaster

回答:


235

文字列を連結するときは、結果を格納するためのメモリを割り当てる必要があります。で開始する最も簡単である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が、可変である必要がない別のバリアントがあります。これは、a を左側、a を右側とする特性の実装ですAddString&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);
}

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

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!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を初めて使う人にわかりやすくするためにそれらを追加しました!


2
Add/ +シンボルについてどう思いますか?必要に応じてカバーできます。
2015年

多分それは十分簡単ですが、それを理解するには、文字列を使用して追加するための可能な型シグネチャを調べる必要があります。
2015年

ありがとう!&Stringを&strとして逆参照する方法について、もう少し詳しく説明できますか?その実装のどの部分がそれを許可するか、および/またはそれがドコでこれをどこに言うのですか?
jsalter

1
@jsalterはかなり別のトピックなので、別のトップレベルの質問としては良いかもしれません。私は適切なドキュメントにリンクするように更新しました(少なくとも取得できる
限り

10
それは相違点に留意する必要がある@ChrisMorgan .to_owned().to_string()IMPL専門に上記のコメントのおかげ以降に修正されました。で呼び出されたときに、どちらも同じパフォーマンスになり&strます。:関連コミットgithub.com/rust-lang/rust/pull/32586/filesを
チャド

49

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

私が見た中で最も良いのは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つで十分だと思います。


どこにjoin文書化されていますか?配列と文字列の中間にあるようです。アレイのドキュメントを検索したところ、すぐに混乱しました。
Duane J

3
@DuaneJ joinは実際にSliceContactExtトレイトにアタッチされています。トレイトは不安定とマークされていますが、そのメソッドは安定しており、Preludeに含まれているため、デフォルトでどこでも使用できます。チームはこの特性が存在する必要がないことを十分に認識しているようであり、私はそれによって将来的に物事が変わると思います。
Simon Whitehead

9

私はそのconcat方法を考えており、+ここでも言及する必要があります:

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

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

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

+既存の回答ですでに言及されています。(これは、Adda Stringを左側、a &strを右側とする特性の実装です。
Shepmaster

確かに、既存の答えは広すぎるので気づかなかった。
1

6

RUSTで文字列を連結する簡単な方法

RUSTには、文字列を連結するためのさまざまな方法があります。

最初の方法(を使用concat!()):

fn main() {
    println!("{}", concat!("a", "b"))
}

上記のコードの出力は次のとおりです。

ab


2番目の方法(push_str()および+演算子を使用):

fn main() {
    let mut _a = "a".to_string();
    let _b = "b".to_string();
    let _c = "c".to_string();

    _a.push_str(&_b);
    
    println!("{}", _a);
 
    println!("{}", _a + &_b);
}

上記のコードの出力は次のとおりです。

ab

ABC


3番目の方法(Using format!()):

fn main() {
    let mut _a = "a".to_string();
    let _b = "b".to_string();
    let _c = format!("{}{}", _a, _b);
    
    println!("{}", _c);
}

上記のコードの出力は次のとおりです。

ab

それをチェックして、Rustプレイグラウンドで実験してください


この回答は、既存の回答に新しいものを追加するものではありません。
Shepmaster
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.