LoginSignup
56

More than 1 year has passed since last update.

&str を String に変換する5つの方法

Last updated at Posted at 2015-07-20

&strString に変換する主なやりかたを紹介する。性能の差は皆無に近いのでどれを使ってもいい。ただし "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}");
  1. 次の2つの実装 impl Display for strimpl<T: Display + ?Sized> ToString for T が存在することによる。

  2. https://github.com/rust-lang/rust/blob/1.65.0/library/alloc/src/string.rs#L2572-L2574

  3. ToOwned は borrowed なデータを clone して owned なデータを得る手段を一般化するトレイト。

  4. 次の2つの実装 impl<'a> From<&'a str> for Stringimpl<T, U> Into<U> for T where U: From<T> が存在することによる。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56