1. ホーム
  2. string

[解決済み] Rust の `String` と `str` の違いは何ですか?

2022-03-14 12:03:58

質問

なぜRustには Stringstr ? とはどのような違いがあるのでしょうか? Stringstr ? どのような場合に String の代わりに str とその逆は?どちらかが非推奨になるのでしょうか?

解決方法は?

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

str はイミュータブルな 1 メモリ上のどこかにある動的な長さのUTF-8バイトのシーケンスです。サイズが不明なため、ポインタの後ろでのみ扱うことができる。つまり str 最も一般的な 2 として表示されます。 &str 通常、quot;string slice"または単にquot;slice"と呼ばれるUTF-8データへのリファレンスです。 スライス は、あるデータに対する単なるビューであり、そのデータは、例えば、どこにでもあることができます。

  • 静的記憶装置において : 文字列リテラル "foo"&'static str . このデータは実行ファイルにハードコードされ、プログラム実行時にメモリにロードされます。

  • ヒープで確保された内部 String : String を参照する。 &str ビュー String のデータです。

  • スタック上 : 例えば、以下のようにスタックに確保されたバイト配列を作成し、その配列から としてそのデータを表示します。 &str :

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

まとめると、以下のようになります。 String 文字列データを所有する必要がある場合(他のスレッドに文字列を渡したり、実行時に文字列を構築したり)には &str は、文字列のビューだけが必要な場合です。

これは、ベクターの関係と同じです。 Vec<T> とスライス &[T] の関係と同様である。 T と参照元 &T は一般的な型である。


1 A str は固定長であるため、末尾から先のバイトを書き込んだり、末尾に無効なバイトを残したりすることはできません。UTF-8は可変長エンコーディングなので、これは事実上、すべての str は、多くの場合、イミュータブルである。一般に、突然変異は以前より多いか少ないバイトを書くことを必要とします。 a (1バイト)を ä (2バイト以上)を使用する場合は、より多くのスペースを str ). を変更することができる特定のメソッドがあります。 &mut str のようなASCII文字のみを扱うものがほとんどです。 make_ascii_uppercase .

2 ダイナミックにサイズ調整されたタイプ のようなものを許可します。 Rc<str> Rust 1.2 からは、参照カウントされた UTF-8 バイトのシーケンスに対応します。Rust 1.21では、これらの型を簡単に作成できるようになりました。