RustにおけるString型、&str型、char型の違いと比較
Rust: String型, &str型, char型の比較
この記事では、Rustで使用される文字列型であるString型、&str型、およびchar型について、その特徴や違いを解説します。
1. 基本的な特徴
String型
- **特徴**: 可変で所有権を持つ文字列型。ヒープ上に格納され、動的に長さを変更可能。
- **主な用途**: 動的な文字列の管理(追加、削除など)や他のスコープへの所有権の移動。
- **例**:
let mut s = String::from("Hello"); s.push('!'); // 末尾に文字を追加 println!("{}", s); // 出力: Hello!
&str型
- **特徴**: 不変で、スライスされた参照型。スタックまたはヒープ上に格納。
- **主な用途**: 関数への引数として渡す、固定データを操作。
- **例**:
let greeting: &str = "Hello, world!"; // スタック上 println!("{}", greeting);
char型
- **特徴**: 単一のUnicodeスカラー値を表現。固定サイズ(4バイト)でスタックに格納。
- **主な用途**: 個別の文字やUnicode文字を扱う場合。
- **例**:
let c: char = 'A'; println!("{}", c); // 出力: A
2. 主な違いの比較
| 特性 | String型 |
&str型 |
char型 |
|---|---|---|---|
| 所有権 | あり | なし(参照) | あり |
| 可変性 | 可変 | 不変 | 不変 |
| 用途 | 動的な文字列操作 | 参照と固定データの操作 | 単一文字の処理 |
| メモリ | ヒープ | スタックまたはヒープ | スタック |
3. 相互変換
String型 ↔ &str型
let string = String::from("Hello");
let str_slice: &str = &string; // スライス
let new_string: String = str_slice.to_string(); // Stringに変換
&str型 ↔ char型
let s = "Hello";
let first_char: char = s.chars().next().unwrap(); // 最初の文字
let char_as_str: String = first_char.to_string(); // charをStringに変換
String型 ↔ char型
let string = String::from("A");
let char_value: char = string.chars().next().unwrap(); // 最初の文字
let new_string = char_value.to_string(); // charからStringを生成
4. 性能の違い
String型: 動的操作が可能で便利ですが、メモリの再割り当てが発生する可能性があります。&str型: 軽量で参照型。性能に優れるが不変。char型: 固定サイズで単一の文字に特化。
5. どれを使うべきか?
String型: 動的操作が必要な場合。&str型: 関数引数や固定データで十分な場合。char型: 個別の文字やUnicode処理。
これらの特徴を活かし、適切な型を選ぶことで効率的なRustプログラムを構築できます。