【初心者入門】Rustの学習

# Hello word表示まで

【環境構築】

- Rustのインストール

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

- `.bash_profile`か `.zsh_profile` に下記を追加してパスを通す

```bash
$ echo export PATH="$HOME/.cargo/bin:$PATH" >> ~/.bash_profile

# 直接入力する場合は下記をコピー
export PATH="$HOME/.cargo/bin:$PATH"
```

- 任意のディレクトリで下記のコマンドを実行するとディレクトリが作成される

```bash
$ cargo new ファイル名

# 作成したディレクトリに移動
$ cd sample-web-app
```

【tomlの設定】

- 作成したディレクトリの配下の`Cargo.toml` に下記を追加
- 1つは今回メインとなる`warp`,もう1つは`warp`が依存する`tokio`という`crate`です。

```rust
[package]
name = "ファイル名"
version = "0.1.0"
authors = ["ユーザー名 <メールアドレス>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
tokio = { version = "0.2", features = ["macros"] } # 追記項目
warp = "0.2" # 追記項目
```

【コード実装】

- `main.rs`に下記を追加
- `warp::path!("hello" / String)` の箇所で URL パスを定義し、 `/hello/` 以下を String 型で受け取ることを宣言する
- `map(|name| format!("Hello, {}!", name))` の箇所で前述のURLからString型で受け取った値と `format!`する処理をつなぐように宣言する

```rust
// 今回のサンプルが必要とする`warp.Filter` traitをimportします。
use warp::Filter;

// 今回tokioのランタイムを利用する
// 非同期ランタイムの上で実行されるためmain関数はasyncをつけて定義します
#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String).map(|name| format!("Hello, {}!", name));

    // Serverの起動
    warp::serve(hello).run(([127, 0, 0, 1], 3030)).await;
}
```

【起動】

- 下記のコマンドでビルドを行う

```bash
$ cargo run
```

- ブラウザかターミナルで`localhost:3030` を確認

```bash
$ curl localhost:3030/hello/world
Hello, world!
```

【参考記事】

https://qiita.com/Veritas666777/items/c01a0df0c9b97f6b2a95

# tomlについて

- このファイルは[TOML](https://github.com/toml-lang/toml)(***Tom's Obvious, Minimal Language***; `直訳`: トムの明確な最小限の言語)フォーマットで、 Cargoの設定フォーマットです。
- 最初の行の`[package]`は、後の文がパッケージを設定していることを示すセクションヘッダーです。もっと情報を追加するにつれて、 別のセクションも追加するでしょう。
- その後の3行が、Cargoがプログラムをコンパイルするのに必要な設定情報をセットします: 名前、バージョン、誰が書いたかです。 Cargoは名前とEメールの情報を環境から取得するので、その情報が正しくなければ、 今修正してそれから保存してください。
- 最後の行の`[dependencies]`は、プロジェクトの依存を列挙するためのセクションの始まりです。 Rustでは、パッケージのコードは***クレート***として参照されます。このプロジェクトでは何も他のクレートは必要ありませんが、 第2章の最初のプロジェクトでは必要なので、その時にはこの依存セクションを使用するでしょう。

```php
[package]
name = "hello_cargo"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]

[dependencies]
```

# Cargoとは

- CargoとはRustのビルドシステム兼、パッケージマネージャ
- Cargoは、コードのビルドやコードが依存しているライブラリのダウンロード、 それらのライブラリのビルド(コードが必要とするライブラリを我々は、依存と呼んでいます)などの多くの仕事を扱ってくれる。

### Cargoコマンドについて

【cargo new】

- `cargo new ファイル名`で`main.rs` も作成する

```bash
$ cargo new ファイル名
```

- `cargo new ファイル名 —lib`でlib.rsが作成される

```bash
$ cargo new ファイル名 —lib
```

【cargo list】

- 依存パッケージの一覧を出力します。

【cargo rm】

- 依存パッケージの削除

【cargo check】

- コンパイルをせずにコードをチェックする事が可能

【cargo build --release】

- `cargo build --release`を使用して、 最適化を行なってコンパイルすることができます。
- このコマンドは、`target/debug`ではなく、 `target/release`に実行可能ファイルを作成して、最適化してRustコードの実行を速くしてくれますが、 オンにするとプログラムをコンパイルする時間が延びます。
- このため、2つの異なるプロファイルがあるのです: 頻繁に再ビルドをかけたい開発用と、繰り返し再ビルドすることはなく、できるだけ高速に動いてユーザにあげる最終的なプログラムをビルドする用です。

【公式リファレンス】

https://doc.rust-jp.rs/book-ja/ch01-00-getting-started.html](https://doc.rust-jp.rs/book-ja/ch01-00-getting-started.html

# Rsutについて

【Rustとは？】

- プログラミング言語には、C++のようなコンパイル言語と、Pythonのようなスクリプト言語がありRustはコンパイル言語にあたります！
    - コンパイル言語は、人が理解できるように書いたプログラムを機械が実行できるように変換します。
    - スクリプト言語では、このような変換が必要ありません。
- 安全性、速度、並行性の3つに焦点を合わせて開発が進められているプログラミング言語です。

【Rustc】

- `rustc`はコンパイラ

```bash
rustc ファイル名
```

【クレート】

- コンパイルの単位
- クレートはバイナリかライブラリのどちらか
- バイナリークレートはコンパイル可能なファイル？

【パッケージ】

- *パッケージ* はある機能群を提供する1つ以上のクレートです。
- パッケージは *`Cargo.toml`*という、それらのクレートをどのようにビルドするかを説明するファイルを持っています。

# Editionについて

【Rust2018】

- Rust 2018とは、簡単に言えば`C++`における`C++11`みたいなものです。
- これまでのRustはRust 2015と呼ばれることになり、Rust 2018ではRust 2015からの破壊的変更が含まれます。
- `Cargo.toml`内でエディションを指定することにより、Rust 2018の機能が利用できるようになります。

【Rust2015との互換性】

- Rust 2018のリリース後も、RustコンパイラはRust 2015で書かれたコードをコンパイルできます。
- また、Rust 2018からRust 2015で書かれたライブラリを使うことも、その逆も可能です。
- コンパイラは異なるエディションのコードをリンクすることができます。
- また、Rust 2015から2018へと自動変換するためのツール`cargo fix`が提供される予定です

【Editionリファレンス】

https://doc.rust-lang.org/edition-guide/introduction.html](https://doc.rust-lang.org/edition-guide/introduction.html)