[初学者向け]Rustを触ってみよう ~変数と基本文法編~

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。
今回の記事はRustの基本文法の書き方についてです。変数とそのデータ型までを備忘録的に記事にしています。前回の記事の続きですので、先に環境構築を行いたい方は以下の記事を参考にしてください。

https://qiita.com/ikemura-ren/items/ed6915f9387da957df63

## 変数
Rustの変数定義について見ていきます。
Rustの場合、`let`を用いて変数を定義するようです。

```Rust:変数定義
let num = 10;
```

変数の中身の確認方法は以下です。
```Rust:dbg!を利用
dbg!(num);
```
もしくは
```Rust:printlnを利用
println!("{}",  num);
```

### マクロってなんだ？
Rustの本を読んでいてマクロってなんだっけ？となった。変数の中身を`dbg!`とか`println!`で確認しているが、エクセルのマクロの話じゃないよね。
関数とも違うらしいのでピンとこなかった。多分Cとかやっている人にはピンとくるんだろうと思う。
公式ドキュメントの説明と睨めっこしてなんとなく理解したことをまとめる。

- 関数は型や引数を厳密に決める必要があるが、マクロはそれにとらわれない
- コンパイル前に動く
- 関数は「何かをやる手順」を決めるもので、マクロは「どんな手順を書くか」を決めるもの

:::note warn
Pythonでいうところのデコレータに近いもの？厳密には違う気がするが、今はそんな理解に留める。
:::

これは後でしっかりまとめていこうと思う。

```Rust:実行したコード
fn main() {
    let num = 10;
    let num1 = 2;
    dbg!(num);
    println!("{}", num1);
}
```


```Bash:実行結果
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/test_hello`
[src/main.rs:6:5] num = 10
2
```

### 算術演算子の場合
```Rust:実行したコード
fn main() {
    let num = 10 + 2;
    let num1 = num * 3;
    dbg!(num);
    dbg!(num1);
}
```

```Bash:実行結果
[src/main.rs:6:5] num = 12
[src/main.rs:7:5] num1 = 36
}
```

`num1`の計算が`10 + 2 * 3`の計算ではなく、先に`10 + 2`が計算された後に`* 3`の計算がされる。先に変数`num`が定義され、その後に`num1`の計算がされる。この順番をしっかり押さえていきたい。

### 不変と可変の話
Rustの変数定義はデフォルトでは不変である。再代入は認めない。ただ、定数はまた別にある。再代入をする際の記述方法もちゃんとあります。

```Rust:書き方
let mut num = 10;
num = num * 2;
```
`mut`修飾子を使うことで、本来不変の変数を可変にすることが可能になります。

:::note warn
今回はデータの型については詳しく書かないです。型推論が搭載されている言語の場合、変数程度では型を意識するところは多くないです。
:::

:::note info
初心者向けに解説すると、変数などに格納するデータには型というものがあります。データとは、数値とか、文字とかそういうのですね。
:::



## 条件分岐
`if`文の書き方は以下になります。変数の値はかなり適当ですが、上の続きでそのまま書いています。
```Rust:条件分岐の書き方
fn main() {
    let num = 10 + 1;
    let num1 = num * 3;

    if num == 12{
        println!("値は12です");
    } else {
        println!("12ではなくなっています");
    }
}
```

```Bash:実行結果
12ではなくなっています
```

if文の書き方は特に他の言語と違いはないですね。

`dbg!`のマクロを使うと条件式の中身の確認もできて便利そう。
```Rust:書き方
fn main() {
    let num = 10 + 1;
    let num1 = num * 3;

    if dbg!(num == 12){
        println!("値は12です");
    } else {
        println!("12ではなくなっています");
    }
}
```

```Bash:書き方
[src/main.rs:7:8] num == 12 = false
12ではなくなっています
```

## 繰り返し
条件分岐の次は繰り返しですね。
#### `for`文
```Rust:書き方
for i in 1..5{
    println!("i = {}", i);
}
```
これは変数`i`の数が1~4の間ブロックの中の処理を繰り返していきます。
```Bash:実行結果
i = 1
i = 2
i = 3
i = 4
```

便利だけど若干わかりにくい書き方だな〜と思ったのが以下⬇️の書き方です。
```Rust:書き方
for i in 1..=5{
    println!("i = {}", i);
}
```
```Bash:実行結果
i = 1
i = 2
i = 3
i = 4
i = 5
```

この場合、変数`i`の数が1~5までになると。むしろ初学者にはこっちの方がわかりやすいかも。

#### `while`文
while文ももちろんありますね。Whileは条件式を書いて、その条件式がTrueになっている時だけ繰り返しの処理を行います。以下は公式ドキュメントにあったコードです。
```Rust:書き方
let mut number = 3;

    while number != 0 {
        println!("{}!", number);

        number -= 1;
    }

    // 発射！
    println!("LIFTOFF!!!");
```
1. 可変の変数を定義して、3を代入
1. while文の条件式は『0ではない場合』を指定
1. whileのブロック範囲内で、変数`number`の値を画面に表示（最初は3）
1. 変数`number`から数値を1ずつ減らしていく
1. 変数`number`の値が1ずつ減っていき、0になったらwhileのブロックを抜けて最後の『LIFTOFF!!!』を画面に表示して終了

#### `loop`文
`loop`はずっと繰り返す構文です。`break`を使うとループを抜けることができるタイプの繰り返しですね。
無限ループは以下の書き方。Ctrl + Cでストップできます。
```Rust:書き方
loop {
    println!("ずっと繰り返す"); 
}
```

`break`文で抜ける場合は`if`文で条件を指定する。
```Rust:書き方
    let mut count = 0;

    loop {
        println!("Count: {}", count);
        count += 1;

        if count == 5 {
            break; // ループを終了する
        }
    }

    println!("ループの終了");

```

:::note warn
タグに関しては今回は触れません。
:::


## おわりに
読了ありがとうございます。
とりあえず余計なことは考えず、基本の構文について記事にしました。
初学者がつまづきそうなものは一旦スキップ。基本中の基本をまずは学んで、深いところは後ででよろしいと思っているタイプです。
次回は関数周りですね。
![398bd021-8cdb-4200-822c-ec44286d504e_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/f6f293cb-fec6-27b5-257b-a47235dc5637.png)

## 余談
基本構文の条件分岐と繰り返しを学んでいる時が一番面白くないと思ってしまうのは自分だけかな、、？