&str
を String
に変換する主なやりかたを紹介する。性能の差は皆無に近いのでどれを使ってもいい。ただし "str".into()
は使いどころがやや異なる。
"str".to_string()
std::string::ToString
トレイトに従って str
が間接的に1実装するメソッド。他の言語にも同名もしくは似た名前のメソッドがあるため、多くの人がまず使うのはこれであろうと思われる。このメソッドは String::from()
にインライン化される。2
"str".to_owned()
std::borrowed::ToOwned
トレイト3に従って str
が実装するメソッド。 "str".to_string()
より1文字短いのが利点といえば利点。
String::from("str")
std::convert::From<T>
トレイトに従って String
が実装する関数。メソッドと比べて str_iter.map(String::from)
のように使えるのが利点。
"str".into()
std::convert::Into<T>
トレイトに従って &str
が間接的に4実装するメソッド。 into()
の返り値の型が String
と推論可能でなければエラーになるため、使いどころが限られる:
let s = "str".into(); // s の型が推論できないのでコンパイルエラーになる
println!("{}", s);
into()
が活躍するのは String
と &str
のどちらでも引数に取れる関数を書くときだ:
fn some_string<S: Into<String>>(s: S) -> Option<String> {
Some(s.into())
}
let s1 = some_string("str");
let s2 = some_string("str".to_string());
assert_eq!(s1, s2);
format!()
変換というよりは整形だが、 &str
から文字列を組み立てるには format!()
が使える。
let name = "str";
let hello = format!("hello {name}");
-
次の2つの実装
impl Display for str
とimpl<T: Display + ?Sized> ToString for T
が存在することによる。 ↩ -
https://github.com/rust-lang/rust/blob/1.65.0/library/alloc/src/string.rs#L2572-L2574 ↩
-
ToOwned
は borrowed なデータを clone して owned なデータを得る手段を一般化するトレイト。 ↩ -
次の2つの実装
impl<'a> From<&'a str> for String
とimpl<T, U> Into<U> for T where U: From<T>
が存在することによる。 ↩