Rust言語の勉強を初めてみた。その3

# Data Type

[Data Type](https://doc.rust-lang.org/book/ch03-02-data-types.html)

スカラーと複合の2つのタイプがある。
Rustでは、コンパイル時に変数の型を知っている必要がある。
通常は自動で認識するが、文字を解析して数値型に変換する場合などは、型注釈を付ける必要がある。

```
let guess: u32 = "42".parse().expect("Not a number!");
```

型注釈がないとエラーになる。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/22e53e8f-52ef-e390-85bd-6f65005dbc4f.jpeg)

## Scalar Types

### Integer Types

| Length           |Signed             |Unsigned            |
|:-----------------|:-----------------|:------------------|
| 8-bit            |i8 |u8        |
| 16-bit           |i16 |u16       |
| 32-bit           |i32 |u32        |
| 64-bit           |i64 |u64         |
| 128-bit          |i128 |u128      |
| arch             |isize |usize       |

archはコンピュータのアーキテクチャによる
64bitアーキテクチャの場合は64、32bitアーキテクチャの場合は32

| Number literals           |Example             |
|:-----------------|:-----------------|
| 10進数            |98_222 |
| 16進数           |0xff |
| 8進数           |0o77 |
| 2進数           |0b1111_0000 |
| バイト(u8のみ)          |b'A' |

'_'は視覚的な区切り記号。金額表示に使用する'$1,000'の','のようなもの。

### Floating-Point Types

f32とf64の2種類がある。それぞれビットサイズが32bitと64bit。デフォルトは64bit。

```
fn main() {
    let x = 2.0; // f64

    let y: f32 = 3.0; // f32
}
```

### Numeric Operations

基本的な四則演算が可能。

[こちら](https://doc.rust-lang.org/book/appendix-02-operators.html)に全ての演算リストがある。

```
fn main() {
    // addition
    let sum = 5 + 10;

    // subtraction
    let difference = 95.5 - 4.3;

    // multiplication
    let product = 4 * 30;

    // division
    let quotient = 56.7 / 32.2;

    // remainder
    let remainder = 43 % 5;
}
```

### The Boolean Type

trueとfalseを取るbool型がある。サイズは1バイト

```
fn main() {
    let t = true;

    let f: bool = false; // with explicit type annotation
}
```

サンプルではfalse時に型を指定しているが、無くても問題無かった。

### The Character Type

シングルクォーテーションで文字を使用することが出来る。
文字列はダブルクォーテーションであることに注意。

```
fn main() {
    let c = 'z';
    let z = 'ℤ';
    let heart_eyed_cat = '😻';
}
```

## Compound Types

Rustには、タプルと配列の2つがある。

### The Tuple Type

様々なタイプの値を1つにグループ化する。サイズは固定長で拡大縮小することはできない。

```
fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
}
```

タプルから値を取り出すときは、以下の様に分解する。

```
fn main() {
    let tup = (500, 6.4, 1);

    let (x, y, z) = tup;

    println!("The value of y is: {}", y);
}
```

ピリオドを付けて値のインデックスを指定することで、直接アクセスすることも出来る。

```
fn main() {
    let x: (i32, f64, u8) = (500, 6.4, 1);

    let five_hundred = x.0;

    let six_point_four = x.1;

    let one = x.2;
}
```

### The Array Type

配列は全ての要素が同じ型でなければならない。固定長。

```
fn main() {
    let a = [1, 2, 3, 4, 5];
}
```

柔軟に使用するにはベクトルを使用した方が良い。

以下の様に型と要素数を記述することが出来る。

```
let a: [i32; 5] = [1, 2, 3, 4, 5];
```

以下の様に書くことで、

```
let a = [3; 5];
```

let a = [3, 3, 3, 3, 3];とすることも出来る。

#### Accessing Array Elements

以下の様にして、要素にアクセスすることができる。

```
fn main() {
    let a = [1, 2, 3, 4, 5];

    let first = a[0];
    let second = a[1];
}
```

firstにはインデックス0の1が入る。
secondにはインデックス1の2が入る。

#### Invalid Array Element Access

```
fn main() {
    let a = [1, 2, 3, 4, 5];
    let index = 10;

    let element = a[index];

    println!("The value of element is: {}", element);
}
```

上のように配列の長さより大きなインデックスを指定すると実行時にエラーになる。

```
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src\main.rs:5:19
```

低水準の言語ならば無効なメモリにアクセス出来てしまうが、Rustではエラーを検出してすぐに終了する。
こうすることによりこの種のエラーからユーザーを保護する。