Rust - 基本的なデータ型について

## はじめに

この記事は、私が Rust の学習時に書いた備忘録となります。間違い等があればコメント等で教えていただけると助かります。

## データ型

Rust には大きく分けて2種類のデータ型(Data Types)がある。

- [スカラー型](#スカラー型)
- [複合型](#複合型)

### スカラー型

スカラー型(Scalar Types)とは単一の値を持つ型のこと。整数や浮動小数点数, 論理値や文字などがそれに該当する。

#### 整数型

整数型(Integer Types)はその名と通り整数の型。
負数を扱える「符号付き」(`i`)と、負数を扱えない「符号無し」(`u`)がある。
また、コンピュータのアーキテクチャに依存する `isize` と `usize` がある。

型注釈がない場合は、デフォルトの整数型である `i32` 型となる。

符号付きは負数を扱えるが、最大値が小さい。符号無しは負数を扱えないが、最大値が大きい:

| 型 | ビット数 | 最小値 | 最大値 |
| --: | --: | :-- | :-- |
| `i8` | 8 | -128 | 127 |
| `i16` | 16 | -32768 | 32767 |
| `i32` | 32 | -2147483648 | 2147483647 |
| `i64` | 64 | -9223372036854775808 | 9223372036854775807 |
| `i128` | 128 | -170141183460469231731687303715884105728 | 170141183460469231731687303715884105727 |
| `isize` | arch | - | - |
| `u8` | 8 | 0 | 255 |
| `u16` | 16 | 0 | 65535 |
| `u32` | 32 | 0 | 4294967295 |
| `u64` | 64 | 0 | 18446744073709551615 |
| `u128` | 128 | 0 | 340282366920938463463374607431768211455 |
| `usize` | arch | 0 | - |

<details>
<summary>ドキュメント</summary>
<div>

- [`i8`](https://doc.rust-lang.org/std/primitive.i8.html)
- [`i16`](https://doc.rust-lang.org/std/primitive.i16.html)
- [`i32`](https://doc.rust-lang.org/std/primitive.i32.html)
- [`i64`](https://doc.rust-lang.org/std/primitive.i64.html)
- [`i128`](https://doc.rust-lang.org/std/primitive.i128.html)
- [`isize`](https://doc.rust-lang.org/std/primitive.isize.html)
- [`u8`](https://doc.rust-lang.org/std/primitive.u8.html)
- [`u16`](https://doc.rust-lang.org/std/primitive.u16.html)
- [`u32`](https://doc.rust-lang.org/std/primitive.u32.html)
- [`u64`](https://doc.rust-lang.org/std/primitive.u64.html)
- [`u128`](https://doc.rust-lang.org/std/primitive.u128.html)
- [`usize`](https://doc.rust-lang.org/std/primitive.usize.html)

</div>
</details>

#### 浮動小数点型

浮動小数点型(Floating-Point Types)は小数点を含む数値を表現する型。単精度(`f32`)と倍精度(`f64`)があり、倍精度である `f64` がデフォルトとなっている。

| 型 | ビット数 | 種類 |
| --: | --: | :-- |
| `f32` | 32 | 単精度浮動小数点数 |
| `f64` | 64 | 倍精度浮動小数点数 |

現代のコンピューターどちらも速度がほぼ変わらないため、精度の高い `f64` を使うことが一般的となっている。

ドキュメント:

- [`f32`](https://doc.rust-lang.org/std/primitive.f32.html)
- [`f64`](https://doc.rust-lang.org/std/primitive.f64.html)

#### 論理値型

論理値(Boolean Types)は真偽値。真を表す `true` と、偽を表す `false` の2種類がある。

ドキュメント: [`bool`](https://doc.rust-lang.org/std/primitive.bool.html)

#### 文字型

文字型(Character Type)とは、単一の Unicode を含む型。ダブルクォーテーション `"` ではなく、シングルクォーテーション`'` を使って文字を囲う。

```rs
let a: char = 'A'
let b: char = '🤓'
```

ドキュメント: [`char`](https://doc.rust-lang.org/std/primitive.char.html)

### 複合型

複合型(Compound Types)とは複数の値を1つの型にまとめることができる型。タプル型や配列型がそれに該当する。

#### タプル型

タプル型(Tuple Types)とは異なる型の値を1つの型にまとめる型。

```rs
let t = (64, 128.0, true, 'X');
```

タプルの中身は `let` キーワードを使って分配することができる:

```rs
let t = (0, 1, 2);
let (i, ii, iii) = t;
println!("{}{}{}", i, ii, iii); // 012
```

もちろん、添字アクセスも可能:

```rs
let t = ('a', 'b', 'c');
println!("{}", t.2); // c
```

可変にすれば上書きも可能:

```rs
let mut t = ("ほうれん草", "しめじ", "ジーマーミ豆腐");
println!("{:?}", t); // ("ほうれん草", "しめじ", "ジーマーミ豆腐")
t.2 = "ピータン豆腐";
println!("{:?}", t); // ("ほうれん草", "しめじ", "ピータン豆腐")
```

ドキュメント: [`tuple`](https://doc.rust-lang.org/std/primitive.tuple.html)

#### 配列型

配列型(Array Types)とは同一の型の値を1つの型にまとめる型。タプルとは異なり、全要素が同じ型でなければならず、長さが固定となっている。

```rs
let a = ["报連草", "占地", "皮蛋豆腐"];
```

添字アクセス:

```rs
let a = ["麦芽コーヒー", "抹茶", "紅茶"];
println!("{}", a[2]); // 紅茶

```

ドキュメント: [`array`](https://doc.rust-lang.org/std/primitive.array.html)