Rustの環境構築 with VSCode

Rustの環境構築のメモです。  
普段、VSCodeで開発しているので、VSCodeで開発しやすいように環境構築していきます。  
[プログラミング言語 Rust, 2nd Edition](https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/)の1章を使って、サクッとやります。   


## ゴール
- RustでHello, world!
- VSCodeでのRustの開発環境が整っている

## 環境
- Mac OS High Sierra 10.13.6
- VSCode Version 1.30.2

## Rustのインストール

Rustのバージョンとツールを管理するrustupのインストール  

```
$ curl https://sh.rustup.rs -sSf | sh
```

```
.
.
.

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>
```

こんなんが表示されるので1を入力。  
1分くらい待つと、

```
Rust is installed now. Great!
```
Rustのインストール終了！

パスを通す。  

```
$ source $HOME/.cargo/env
```
　  
Rustのバージョンを確認する。  

```
$ rustc --version
rustc 1.32.0 (9fda7c223 2019-01-16)
```
　  

## VSCodeの環境構築
VSCodeの左側一番下の四角アイコン開いて、「Rust(rls)」を検索し、インストール。  
これを入れると補完とかが効くようになる。  

![Screen Shot 2019-01-19 at 1.36.01.png](https://qiita-image-store.s3.amazonaws.com/0/93960/faee64a8-6ac6-e453-87ed-037e78271d94.png)
　  
## Hello, World!
とりあえず、ディレクトリの作成

```
$ mkdir learn_rust
$ cd learn_rust
$ mkdir hello_world
$ cd hello_world
```

main.rsを作る。

```
$ touch main.rs
```

下記コードを入力して、

```
fn main() {
    // はろーわーるど！
    println!("Hello, world!");
}
```
　  
ターミナルで

```
$ rustc main.rs
$ ./main
Hello, world!
```
　  
やったぜ！  

#### ちょいメモ    
- main関数が1番最初に走るコード
- タブではなく、4スペース
- !は関数ではなく、マクロを呼んでいる

　  
## Hello, World! with Cargo  
終わったと思いきや、もう一度"Hello, World!"
Cargoというビルドシステム兼、パッケージマネージャを使ってもう一度"Hello, World!"します。 
Rust開発者の標準ツールらしい。(rustupで勝手に入る)  

Cargoのバージョン確認

```
$ cargo --version
cargo 1.32.0 (8610973aa 2019-01-02)
```

Cargoでプロジェクトの作成

```
$ cargo new hello_cargo 
$ cd hello_cargo
```
※ Rust 1.25.0から`--bin`がデフォルトになったので、optionをつける必要はないとのこと
（@scivolaさんご指摘ありがとうございます！）

これだけで、src/main.rsは下記のようになっている。  

```
fn main() {
    println!("Hello, world!");
}
```
　  
ビルドする。

```
$ cargo build
   Compiling hello_cargo v0.1.0 (/Users/****/learn_rust/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.03s
```
　  
さっきと違うのは、実行ファイルがカレントディレクトリではなく、**target/debug** 下に作成されること。
そのため、実行時は下記のようになる。  

```
$ ./target/debug/hello_cargo
Hello, world!
```
　  
cargo runを使うと、コードをコンパイルして実行ファイルの実行までの1コマンドで実行できる。

```
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.12s
     Running `target/debug/hello_cargo`
Hello, world!
```
　  
cargo checkを使うと、コンパイル可能かを確認してくれる。

```
$ cargo check
    Checking hello_cargo v0.1.0 (/Users/****/learn_rust/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.57s
```
Rustでの開発ではcargo checkでコンパイル可能かを確かめてから、cargo buildで実行ファイルを生成するというのが基本的な流れらしい。
cargo checkが多用されるので、Rust 1.32.0 からは`cargo c`で動くとのこと。（@scivolaさんご指摘ありがとうございます！）
　  
リリース時にはcargo build --releaseを使うと最適化してコンパイルしてくれるらしい。便利。

```
$ cargo build --release
   Compiling hello_cargo v0.1.0 (/Users/takashi.udagawa/learn_rust/hello_cargo)
    Finished release [optimized] target(s) in 1.06s
```
通常ビルドの際は、**target/debug**下に実行ファイルができていたが、リリースビルドをすると**target/release**下に実行ファイルが生成される。  



## まとめ  
下記でRustの環境構築は一旦完了！  

- rustupのインストール
- VSCodeにrlsをインストール
- cargoの基本コマンドを理解する
  - プロジェクト作成　：cargo new プロジェクト名
  - ビルド　　　　　　：cargo build
  - ビルド＆実行　　　：cargo run
  - コンパイルチェック：cargo check(cargo c)
  - リリースビルド　　：cargo build --release  


思った以上にサクッといって、特に詰まることもなく良かった！