1. ホーム
  2. string

[解決済み] 文字列を連結する方法を教えてください。

2022-02-04 22:06:57

質問事項

次のような型の組み合わせを連結するにはどうしたらよいですか。

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

解決方法は?

文字列を連結する場合、その結果を格納するためにメモリを確保する必要があります。最も簡単に始められるのは 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);

    // After https://rust-lang.github.io/rfcs/2795-format-args-implicit-identifiers.html
    // let together = format!("{borrowed_string}{another_borrowed_string}");

    println!("{}", together);
}

どちらの入力変数もimmutableなので、触れられていないことがわかる。もし、同じことを 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);

    // After https://rust-lang.github.io/rfcs/2795-format-args-implicit-identifiers.html
    // 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を初めて使う人たちに人気があると思うので、分かりやすくするために追加しました。