プログラミング

Rustのデータ型完全ガイド

Rustのデータ型(Data Types)は、プログラミングにおける非常に重要な要素です。Rustは静的型付けの言語であるため、変数が保持できる値の種類を明示的に定義しなければなりません。この記事では、Rustで使用される主要なデータ型について完全かつ包括的に説明します。

1. 基本的なデータ型

1.1 整数型 (Integer Types)

Rustでは、整数型は符号付きと符号なしの両方が存在します。整数型は、整数値を扱うための型です。

  • 符号付き整数(signed integer)

    • i8 : 8ビット
    • i16 : 16ビット
    • i32 : 32ビット
    • i64 : 64ビット
    • i128 : 128ビット
    • isize : アーキテクチャ依存(32ビットまたは64ビット)
  • 符号なし整数(unsigned integer)

    • u8 : 8ビット
    • u16 : 16ビット
    • u32 : 32ビット
    • u64 : 64ビット
    • u128 : 128ビット
    • usize : アーキテクチャ依存(32ビットまたは64ビット)

整数型は、数値計算やインデックスの操作などで頻繁に使用されます。isizeおよびusizeは、主にポインタのサイズやアーキテクチャに依存する処理に使われます。

1.2 浮動小数点型 (Floating-Point Types)

浮動小数点型は、小数を扱うための型です。Rustでは、2つの浮動小数点型があります。

  • f32 : 32ビット浮動小数点数
  • f64 : 64ビット浮動小数点数(デフォルト)

浮動小数点型は、科学的計算や精度が必要な演算に使用されます。

1.3 真偽値型 (Boolean Type)

Rustでは、真偽値を表す型はboolです。bool型は、trueまたはfalseのいずれかの値を取ります。

  • bool : trueまたはfalse

この型は条件式や論理演算に使用されます。

1.4 文字型 (Character Type)

Rustでは、文字を表す型としてcharがあります。char型は、Unicodeスカラー値を1文字として表現します。1文字は、4バイト(32ビット)で表されます。

  • char : 1文字のUnicodeスカラー値(例:'a''あ''😊'

文字型は、文字列の操作や文字ごとの処理に利用されます。

2. 複合型 (Compound Types)

2.1 タプル型 (Tuple)

タプルは、複数の異なる型の値を1つにまとめたものです。タプルの各要素は異なる型を持つことができます。タプルは、括弧で囲まれたカンマ区切りの値で表されます。

rust
let tuple: (i32, f64, char) = (42, 3.14, 'a');

タプルの要素には、インデックスでアクセスすることができます。インデックスは0から始まります。

rust
let first = tuple.0; // 42 let second = tuple.1; // 3.14

タプルは、関数の戻り値として複数の値を返す場合などに便利です。

2.2 配列型 (Array)

配列は、同じ型の要素が並んだものです。Rustでは配列のサイズは固定されており、宣言時にサイズを決定します。

rust
let array: [i32; 3] = [1, 2, 3];

配列の各要素にはインデックスでアクセスできます。

rust
let first = array[0]; // 1 let second = array[1]; // 2

配列は、同じ型の複数の要素をまとめて扱いたい場合に使用されます。

3. 所有権と借用

Rustは所有権と借用(Ownership and Borrowing)に基づくメモリ管理システムを採用しており、これによりガーベジコレクションなしでメモリ管理が行われます。これに関連する重要な概念として「参照型(References)」があります。

3.1 参照型 (Reference Types)

参照は、メモリ上のデータへの「ポインタ」のようなものです。参照には2種類があります。

  • 不変参照 (&T) : データを変更しない参照
  • 可変参照 (&mut T) : データを変更できる参照
rust
let x = 5; let y = &x; // 不変参照

可変参照は、一度に1つの可変参照のみを持つことができます。この制約により、データ競合を防ぎます。

4. ユーザー定義型

Rustでは、ユーザーが独自のデータ型を定義することができます。これには、struct(構造体)やenum(列挙型)などが含まれます。

4.1 構造体型 (Struct)

構造体は、異なる型のデータをまとめるための型です。

rust
struct Person { name: String, age: u32, }

構造体は、複数のフィールドを持つことができ、それぞれ異なる型を持つことが可能です。

4.2 列挙型 (Enum)

列挙型は、複数の異なる値の選択肢を持つ型です。

rust
enum Direction { Up, Down, Left, Right, }

列挙型は、異なる状態を持つ値を表すために使用されます。

5. Option型とResult型

Rustでは、Option型とResult型という特別な列挙型がよく使われます。

5.1 Option型

Option型は、値があるかもしれないし、ないかもしれないという場合に使用します。

rust
enum Option { Some(T), None, }

5.2 Result型

Result型は、操作が成功したかどうかを示すために使用されます。

rust
enum Result { Ok(T), Err(E), }

これらはエラーハンドリングに非常に便利です。

6. その他のデータ型

6.1 スライス型 (Slice)

スライスは、配列やベクタの一部分を参照する型です。固定長の配列や動的なベクタの一部分にアクセスするために使用します。

rust
let arr = [1, 2, 3, 4, 5]; let slice = &arr[1..4]; // [2, 3, 4]

6.2 関数型 (Function Type)

Rustでは、関数自体もデータ型として扱われます。関数型は、関数を変数に代入したり、他の関数の引数として渡したりできます。

rust
fn add(a: i32, b: i32) -> i32 { a + b } let sum: fn(i32, i32) -> i32 = add;

まとめ

Rustのデータ型は、プログラムの安全性、効率性、可読性を確保するために設計されています。基本的な型から複合型、ユーザー定義型、さらにOption型やResult型などの特殊な型まで、Rustではさまざまなデータ型を効果的に活用することができます。これらのデータ型を適切に使いこなすことで、より堅牢で効率的なRustプログラムを作成できるようになります。

Back to top button