[解決済み] Rust の `String` と `str` の違いは何ですか?
質問
なぜRustには
String
と
str
? とはどのような違いがあるのでしょうか?
String
と
str
? どのような場合に
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では、これらの型を簡単に作成できるようになりました。
関連
-
[解決済み] 文字列リテラルの前にある'b'文字は何を意味するのでしょうか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] Bashで文字列を小文字に変換する方法は?
-
[解決済み] C++の文字列==とcompare()の違い?
-
[解決済み] 文字列中の一部の文字を別の文字に置き換える
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ラベル付き数値変数から文字列変数を生成する方法 (Stata)?
-
[解決済み] Groovyの複数行のStringの何が問題なのですか?
-
[解決済み] textとvarcharの違い(character varying)
-
[解決済み] Goの文字列を印刷せずにフォーマットしますか?
-
[解決済み] Flutterで16進数の色文字列を使用するにはどうすればよいですか?
-
[解決済み] シェルスクリプトでの大文字小文字を区別しない文字列の比較
-
[解決済み] 文字列の文字数を取得する方法
-
[解決済み] Swift: 列挙型の値を文字列に変換しますか?
-
[解決済み] 関数の引数として、文字列(&String)、Vec(&Vec)、ボックス(&Box)への参照を受け取ることは、なぜ推奨されないのですか?
-
[解決済み] 文字列の0は何ですか?