コーディングテストではRustを使えると便利かもしれない。

Rustを業務で書いたことがなくても、
コーディングテストのときに書けると色々便利そうなので記事にしてみます。
Rustをコーディングテストで書けると以下のようなメリットがあります。

- Rustを書く機会を得ることができる。
- 同一ファイル内にテストが書け、すぐ実行できるので正誤がわかりやすい。
- 実行速度やメモリ使用量が小さいので、他の言語と比較して優位になる(かもしれない)。

特にこの記事では、Rustでは同一ファイル内にテストを書いて実行できるので便利そうだよということで書いています。

## Rustのインストールと下準備
macとVSCodeを使っている方向けに簡単に書いておきます。

### Rustのインストール

ターミナルで以下のコマンドを叩いてRustをインストールしましょう。

```
$ curl --proto '=https' --tlsv1.2 -sSf [https://sh.rustup.rs](https://sh.rustup.rs/) | sh
```

バージョン確認

```
$ cargo --version
```

プロジェクト作成

```
$ cargo new your_project_name --bin
```

プロジェクトの実行 or build

```
$ cd your_project_name
$ cargo run
$ cargo build
```

### VSCodeでプラグインをインストール

rust-analyzerというプラグインをインストールします。

[rust-analyzer](https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer)

Rustというプラグインがあってインストールしたくなってしまいますが、どうやら古くなっているようです。rust-analyzerを使っておいた方が良さそうです。

[Rust | User Reviews](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust&ssr=false#review-details)

### ファイル分割

main.rs内に書くこともできますが、一応ファイル分割しておきましょう。

main.rs

```rust
mod fizz_bazz;

fn main() {
    fizz_bazz::run();
}
```

fizz_bazz.rs

```rust
pub fn run() {
  println("sample");
}
```

## fizzbazzを書いてみる。

適当にfizzbazz書いてみます。解答パターンは2種類ありそうなので2つ書いてみました。
fizzbazz2の方は、テストを失敗させたいので、あえてタイポを入れています。

```rust
pub fn run() {
  for i in 1..100 {
    println!("{} {}", i, return_fizz_bazz(i));
  }
  for i in 1..100 {
    println!("{} {}", i, return_fizz_bazz2(i));
  }
}

fn return_fizz_bazz(i: u32) -> &'static str {
  return if i % 15 == 0 {
    "fizzbuzz"
  } else if i % 5 == 0 {
    "buzz"
  } else if i % 3 == 0 {
    "fizz"
  } else {
    ""
  };
}

fn return_fizz_bazz2(i: u32) -> std::string::String {
  let fizz_result = if (i % 3) == 0 { "fizz" } else { "" };
  let buzz_result = if (i % 5) == 0 { "buzzzzz" } else { "" };
  let answer = format!("{}{}", fizz_result, buzz_result);
  answer
}

```

上記のテストをしたいので、同一ファイルの下部に以下のテストを書きます。

```rust
#[test]
fn fizz_bazz_test() {
  assert_eq!(return_fizz_bazz(1), "");
  assert_eq!(return_fizz_bazz(3), "fizz");
  assert_eq!(return_fizz_bazz(4), "");
  assert_eq!(return_fizz_bazz(5), "buzz");
  assert_eq!(return_fizz_bazz(15), "fizzbuzz");
}
#[test]
fn fizz_bazz_test2() {
  assert_eq!(return_fizz_bazz2(1), "");
  assert_eq!(return_fizz_bazz2(3), "fizz");
  assert_eq!(return_fizz_bazz2(4), "");
  assert_eq!(return_fizz_bazz2(5), "buzz");
  assert_eq!(return_fizz_bazz2(15), "fizzbuzz");
}
```

テストを書くと、VSCode上で#[test]の下に Run Test と表示されます。

![スクリーンショット 2021-08-31 17.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178099/f1a34fc3-9d26-d2d7-bafa-7db03f9248be.png)


fizz_bazz_testのRun Testをクリックすると、以下のようにターミナルに表示されてテストがパスしていることがわかります。

```
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out; finished in 0.00s
```

なお、fizz_bazz_test2のRun Testをクリックすると、fizz_bazz_test2を混ぜていたので失敗してくれます。

```
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 3 filtered out; finished in 0.03s
```

---

Rustを使った実プロジェクトはまだ少ないと思いますが、
簡単なコーディングテストからであれば、
気軽に始めることができそうです。

ちなみにFizzBazzはありふれた題材ですが、
[Re:FizzBuzzから始めるRust生活](https://qiita.com/hinastory/items/543ae9749c8bccb9afbc)
みたいな素晴らしい記事もあります。

この記事をみるとFizzBazzからでもRustの理解を深めていくことができそうですね。