ベストアンサー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
1は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 では、これらの型を簡単に作成できます。