(DAY6) 俺と学ぶRust言語~変数の型~

## 今日の内容
- 変数型
- 型推論
- 型指定

# はじめに
[前回](https://qiita.com/FUKAch/items/d9f2bae91dc472ee4230)はフィボナッチ数列を通して変数定義について学びました。今回は、Rustでの型について学びます。

# 型
Rustは静的型付き言語です。とはいえ、今まで変数定義に型指定はしてきませんでした。なぜでしょうか？それは、Rustには **型推論** が搭載されているからです。

### 型推論とは
型推論とは、ソースコード内の変数や式の型を自動的に推論してくれる機能。

今まで変数を定義するときは、
```rust
let 変数名 = 値;
```
のようにしてきました。ここで、C言語での変数定義を思い出してみましょう。
```c
int a = 1;
float b = 1.0;
char c = 'c';
```
C言語では、変数を定義するときに、その変数の型を指定する必要がありました。しかし、以前にRustは型に厳格であるといいました。

ここで疑問に思うのは、なぜ型に厳格なのに、C言語のように型を明確に示す必要がないのか、ということです。その理由は、見比べてみたらわかりやすいですが、可読性によるものです。

```rust
let a = 1;
let b = 1.0;
let c = 'c';
let d = "RUST VS C";
```

```c
int a = 1;
float b = 1.0;
char c = 'c';
char d[10] = "RUST VS C\0";
```

確かにRustでの変数定義のほうが揃っていて見やすいですね。しかし、本当にそれだけが理由でしょうか？実は、型推論のほうが、むしろ安全性が高いのです。型推論では、推論に失敗するとその時点でエラーを出してくれるので、エラーの早期発見ができるのです。

# 型指定の必要性
ここまで、型推論のすごさを感じてきました。では、型指定は必要あるのでしょうか？
実は、**型推論が有効なのは「関数の内側」** だけなのです。そのため、関数の定義や、より発展的なデータ型を使ったりする場合には、型の定義が必須になります。

# 数値型
Rustにおける数値には、大きく分けて「符号付整数」、「符号なし整数」、「浮動小数点数」の三種類になります。

符号付整数
| 型         | 説明                                                      |
|:-----------|:----------------------------------------------------------|
| i8         | 8ビット整数（-128から127）                                 |
| i16        | 16ビット整数（-32768から32767）                            |
| i32        | 32ビット整数（-2147483648から2147483647）                  |
| i64        | 64ビット整数（-9223372036854775808から9223372036854775807）|
| i128       | 128ビット整数（-2¹²⁷から2¹²⁷-1）                           |
| isize      | ポインタサイズ整数型（コンピュータ依存。64bitとか32bitとか。) |

符号なし整数
| 型         | 説明                                                            |
|:-----------|:----------------------------------------------------------------|
| u8         | 8ビット整数（0から255）                                          |
| u16        | 16ビット整数（0から65535）                                       |
| u32        | 32ビット整数（0から4294967295）                                  |
| u64        | 64ビット整数（0から18446744073709551615）                        |
| u128       | 128ビット整数（0から2¹²⁸-1）                                     |
| usize      |ポインタサイズ符号なし整数型（コンピュータ依存。64bitとか32bitとか。) |

浮動小数点数型
| 型         | 説明                                                            |
|:-----------|:----------------------------------------------------------------|
| f32        | 32ビット浮動小数点数（実数）                                      |
| f64        | 64ビット浮動小数点数（実数）                                      |

# 型の範囲を知る方法
型の範囲は「i8::MIN」や「i8::MAX」で取得できます。
つまり、次のようにすることで、わざわざ検索しなくても確認することができます。
```rust
fn main(){
    println!("-------- 符号付き整数 --------");
    println!("i8:   {}~{}", i8::MIN, i8::MAX);
    println!("i16:  {}~{}", i16::MIN, i16::MAX);
    println!("i32:  {}~{}", i32::MIN, i32::MAX);
    println!("i64:  {}~{}", i64::MIN, i64::MAX);
    println!("i128: {}~{}", i128::MIN, i128::MAX);

    println!("-------- 符号なし整数 --------");
    println!("u8:   {}~{}", u8::MIN, u8::MAX);
    println!("u16:  {}~{}", u16::MIN, u16::MAX);
    println!("u32:  {}~{}", u32::MIN, u32::MAX);
    println!("u64:  {}~{}", u64::MIN, u64::MAX);
    println!("u128: {}~{}", u128::MIN, u128::MAX);
}
/******** 出力結果 *******
-------- 符号付き整数 --------
i8:   -128~127
i16:  -32768~32767
i32:  -2147483648~2147483647
i64:  -9223372036854775808~9223372036854775807
i128: -170141183460469231731687303715884105728~170141183460469231731687303715884105727
-------- 符号なし整数 --------
u8:   0~255
u16:  0~65535
u32:  0~4294967295
u64:  0~18446744073709551615
u128: 0~340282366920938463463374607431768211455
*************************/
```

# 型指定
変数宣言の際、型推論を使わずに自分で型を指定するには、以下のように記述します。
```rust
let 変数名: 型名 = 値;
```
:::note warn
Rustでは、計算をする際に必ず値同士が、同じ型である必要があります。
:::

# おわりに
おつかれさまでした。今回は、100DaysOfCode 六日目として、変数の「型」ついて学びました。次回はシーザー暗号を解いて、もう少しRustについて詳しく学んでいきます。
ご精読、ありがとうございました。