回答:
文字列を連結するときは、結果を格納するためのメモリを割り当てる必要があります。で開始する最も簡単である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
が、可変である必要がない別のバリアントがあります。これは、a を左側、a を右側とする特性の実装です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!
。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を初めて使う人にわかりやすくするためにそれらを追加しました!
Add
/ +
シンボルについてどう思いますか?必要に応じてカバーできます。
.to_owned()
と.to_string()
IMPL専門に上記のコメントのおかげ以降に修正されました。で呼び出されたときに、どちらも同じパフォーマンスになり&str
ます。:関連コミットgithub.com/rust-lang/rust/pull/32586/filesを
複数の文字列を別の文字で区切られた単一の文字列に連結するには、いくつかの方法があります。
私が見た中で最も良いのは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
は実際にはSliceContactExt
トレイトにアタッチされています。トレイトは不安定とマークされていますが、そのメソッドは安定しており、Preludeに含まれているため、デフォルトでどこでも使用できます。チームはこの特性が存在する必要がないことを十分に認識しているようであり、私はそれによって将来的に物事が変わると思います。
私はそのconcat
方法を考えており、+
ここでも言及する必要があります:
assert_eq!(
("My".to_owned() + " " + "string"),
["My", " ", "string"].concat()
);
concat!
マクロもありますが、リテラルのみです:
let s = concat!("test", 10, 'b', true);
assert_eq!(s, "test10btrue");
RUSTには、文字列を連結するためのさまざまな方法があります。
concat!()
):fn main() {
println!("{}", concat!("a", "b"))
}
上記のコードの出力は次のとおりです。
ab
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
Using format!()
):fn main() {
let mut _a = "a".to_string();
let _b = "b".to_string();
let _c = format!("{}{}", _a, _b);
println!("{}", _c);
}
上記のコードの出力は次のとおりです。
ab
それをチェックして、Rustプレイグラウンドで実験してください
str
と&str
されているさまざまな種類や時間の99%を、あなたが唯一気にすべきです&str
。それらの違いを詳述する他の質問があります。