次のタイプの組み合わせを連結するにはどうすればよいですか:
str
およびstr
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);
}
ここには、変更可能な所有文字列があります。メモリ割り当てを再利用できる可能性があるため、これは効率的です。 String
とString
についても、&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を初めて使用する人にはわかりやすいように追加しました。
複数の文字列を別の文字で区切られた単一の文字列に連結するには、いくつかの方法があります。
私が見た中で一番いいのは、配列で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つで十分であることがわかりました。