1. ホーム
  2. rust

[解決済み] Stringを&'static strに変換する方法

2022-06-05 13:12:55

質問

を変換するにはどうすればよいのでしょうか? String&str ? 具体的には、これを strstatic の寿命 ( &'static str ).

どのように解決するのですか?

Rust 1.0用に更新しました。

を取得することはできません。 &'static str から String なぜなら String がプログラムの全生涯を生き続けるとは限らないからで、そのために &'static の寿命が意味します。によってパラメータ化されたスライスのみを取得することができます。 String によってパラメタライズされたスライスだけが、 そこから自分のライフタイムを取得することができます。

から行くには String からスライス &'a str に変換するには、スライス構文を使用します。

let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..];  // take a full slice of the string

あるいは StringDeref<Target=str> を実装し、明示的な再借入を行います。

let s_slice: &str = &*s;  // s  : String 
                          // *s : str (via Deref<Target=str>)
                          // &*s: &str

さらに簡潔な構文を可能にする別の方法もありますが、これはコンパイラが目的の型を決定できる場合のみ使用できます(例:関数の引数や明示的に型付けされた変数バインディングなど)。これは 参照強制 と呼ばれるもので、これによって単に & 演算子を使うことができ、コンパイラは自動的に適切な量の * を自動的に挿入します。

let s_slice: &str = &s;  // okay

fn take_name(name: &str) { ... }
take_name(&s);           // okay as well

let not_correct = &s;    // this will give &String, not &str,
                         // because the compiler does not know
                         // that you want a &str

このパターンは String / &str - で接続されているすべての型のペアで使用することができます。 Deref を介して接続されているすべての型のペアで使うことができます。 CString / CStr そして OsString / OsStr から std::ffi モジュールまたは PathBuf / Path から std::path モジュールになります。