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プログラムを構築できます。