Rust の `String` と `str` の違いは何ですか? 質問する

Rust の `String` と `str` の違いは何ですか? 質問する

Rustにはなぜ両方があるのでしょうかStringそしてstr? それらの違いは何ですか? また、どちらを使用するのが適切ですか? どちらかが廃止される予定ですか?

ベストアンサー1

Stringは、 のような動的ヒープ文字列型ですVec。文字列データを所有または変更する必要がある場合に使用します。

strメモリ内のどこかにある、動的な長さの UTF-8 バイトの不変の1シーケンスです。サイズが不明なので、ポインターの背後でのみ処理できます。つまり、str最も一般的には2 は次のように表示されます&str。通常、「文字列スライス」または単に「スライス」と呼ばれる、UTF-8 データへの参照です。スライスは単なるデータのビューであり、そのデータはどこにでも存在する可能性がある。例えば

  • 静的ストレージの場合: 文字列リテラル"foo"は です&'static str。データは実行可能ファイルにハードコードされ、プログラムの実行時にメモリにロードされます。

  • 割り当てられたヒープ内String:String&strビューへの参照解除のデータのString

  • スタック上: 例えば、次のコードはスタックに割り当てられたバイト配列を作成し、そのデータを&str:

    use std::str;
    
    let x: [u8; 3] = [b'a', b'b', b'c'];
    let stack_str: &str = str::from_utf8(&x).unwrap();
    

要約すると、String所有する文字列データが必要な場合 (文字列を他のスレッドに渡したり、実行時に構築したりする場合など) は を使用し、&str文字列のビューのみが必要な場合は を使用します。

これは、ベクターVec<T>とスライスの関係と同一であり、一般的な型の&[T]値渡しTと参照渡しの関係に似ています。&T


1str固定長です。末尾を超えてバイトを書き込んだり、無効なバイトを残したりすることはできません。UTF-8 は可変幅のエンコードなので、str多くの場合、すべての は事実上不変になります。一般に、変更には、以前よりも多くのバイトまたはより少ないバイトを書き込む必要があります (たとえば、a(1 バイト) をä(2 バイト以上) に置き換えるには、 に余裕を持たせる必要がありますstr)。 をその場で変更できる特定のメソッドがあり&mut str、そのほとんどは ASCII 文字のみを処理します。make_ascii_uppercase

2 動的にサイズが変化する型Rc<str>Rust 1.2 以降では、参照カウントされた UTF-8 バイトのシーケンスなどが許可されます。Rust 1.21 では、これらの型を簡単に作成できます。

おすすめ記事