Rustを極めたい - 0

# Rustとは

2015年に正式リリースされた比較的新しめのプログラミング言語です。WEBブラウザのFirefoxを手掛けるMozilla社によって開発が進められています。直近だと2023年6月1日にバージョン1.70がリリースされました。

Rustには下記のような特徴があります。

- 仮想マシン・ガベージコレクションを持たないため、C/C++と同等の実行速度を実現できる。
- モダンな文法で書くことができる。
- OSなどのシステム開発からWEBアプリケーション開発まで幅広く実装することができる。
- コンパイルエラーが非常に親切でわかりやすい。
- 「所有権」「借用」「ライフタイム」などの言語仕様により、メモリセーフなコーディングができる。
- PythonやGoなどと比べると、若干学習コストが高い。
- 言語レベルでの制約が厳しい分、誰が書いても比較的読みやすいコードになる。
- 公式のドキュメントが充実している。

## とにかく始めてみよう

[公式サイト](https://www.rust-lang.org/ja/learn/get-started)に従い、Rustと周辺ツールをインストールします。

ターミナルで下記コマンドを実行して、インストール出来ているか確認します。
```terminal
$ rustup --version
rustup 1.26.0 (5af9b9484 2023-04-05)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.70.0 (90c541806 2023-05-31)`


$ cargo --version
cargo 1.70.0 (ec8a8a0ca 2023-04-25)
```

それぞれバージョンが表示されれば成功です。

### `rustup`って何？

Mozilla社が出しているRustの公式インストーラ兼バージョン管理ツール。`rustup update`で最新のRustをインストールしたり、`toolchain`と呼ばれる、コンパイラ・関連ツール・標準ライブラリ一式を管理することができます。

### `cargo`って何？

こちらもRustインストール時に付属する公式のビルドツール兼パッケージマネージャー。`cargo new project_name`で新規プロジェクトを作成したり、`cargo run`で、作成したプロジェクトを実行することができます。

## RustでHello World!プロジェクトを作ってみよう

`cargo`を使って、新しいプロジェクトを作成します。プロジェクト名はなんでも良いですが、全て小文字・単語間はアンダーバーで繋げるスネークケースにします。コマンドが成功すると、カレントディレクトリにプロジェクト名の付いたフォルダが生成されます。

```terminal
$ cargo new hello_world
     Created binary (application) `hello_world` package

$ ls
hello_world
```

プロジェクトフォルダの中身は、下記のようになっています。

```terminal
$ cd hello_world
$ tree
.
├── Cargo.toml
└── src
    └── main.rs
```

`Cargo.toml`というファイルは、プロジェクトの設定ファイルになります。ここには、プロジェクトの情報・ライブラリの依存関係などが記載されます。Javascriptの`package.json`ファイルのようなものです。

```toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

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

[dependencies]
# ここにライブラリなどの依存関係を書いていく
```

`src`ディレクトリの配下に、実際のRustコードを書いていきます。`cargo`を使ってプロジェクトを作成すると、最初から下記のようなコードが書かれています。

```rust
// src/main.rs

fn main() {
    println!("Hello, world!");
}
```

プロジェクトを実行して、結果を見てみましょう。

```terminal
$ cargo run
   Compiling hello_world v0.1.0 (/path/to/project/hello_world)
    Finished dev [unoptimized + debuginfo] target(s) in 1.18s
     Running `target/debug/hello_world`
Hello, world!
```

### `hello world`プロジェクトで色々試してみよう

ソースコードを書き換えて、出力がどのように変わるか確認してみましょう。


#### `println!()`で複数行出力

```rust
// src/main.rs

fn main() {
    println!("Hello,");
    println!("World!!");
}
```

```terminal
$ cargo run
   Compiling hello_world v0.1.0 (/path/to/project/hello_world)
    Finished dev [unoptimized + debuginfo] target(s) in 0.45s
     Running `target/debug/hello_world`
Hello,
World!!
```

#### `for`と`if`で繰り返しと条件分岐
```rust
// src/main.rs

fn main() {
    for i in 0..10{
        if i % 2 == 0 {
            println!("hello?");
        }else{
            println!("world!!");
        }
    }
}
```

```terminal
$ cargo run
   Compiling hello_world v0.1.0 (/path/to/project/hello_world)
    Finished dev [unoptimized + debuginfo] target(s) in 0.58s
     Running `target/debug/hello_world`
hello?
world!!
hello?
world!!
hello?
world!!
hello?
world!!
hello?
world!!
```

#### 変数と繰り返しで縦書きに
```rust
// src/main.rs

fn main() {
    let message: String = String::from("hello world!");
    for i in message.chars(){
        println!("{}",i);
    }
}
```

```terminal
$ cargo run
   Compiling hello_world v0.1.0 (/path/to/project/hello_world)
    Finished dev [unoptimized + debuginfo] target(s) in 0.42s
     Running `target/debug/hello_world`
h
e
l
l
o
 
w
o
r
l
d
!
```

## 終わりに

[次回](https://qiita.com/on_c98/items/db88c333d2e78f30bd8f)は、変数・定数・データ型・関数などについて書いていこうと思います。