---
# System prepended metadata

title: Rust language Crush Course 1
tags: [develop env, cargo, Rust, youtube]

---

###### tags: `Rust` `youtube` `cargo` `develop env` 
# Rust language Crush Course 1

Rustは一般的に、システムプログラミング言語と呼ばれる
C, C++, Golang など、高速に動作する実行ファイルを作成する


ただし、昨今はWeb Assemblyの登場により、Webプログラミング言語としての用途も増えている

[TOC]

## Web assembly
略してwasmともいう
Web上で効率的に動作する low level のバイトコード

## その他特徴
- 高速(C++並)
- メモリ管理がセキュア
- garbage collection を持たない
- メモリ管理が必要ない
- cargo というパッケージマネージャーがあり、npm のように依存関係やバージョンを管理できる

 
# 1. 準備
1. Rustをインストール
公式サイトのGet Startedのコマンドを実行
`curl https://sh.rustup.rs -sSf | sh`
brew でもいい

2. エディタの準備
vscodeを使用
Extension で **Rust(rls)** を使用
vscode がうまく Language Serverを読み込まないときは
setting.jsonに以下を書き込む
`"rust-client.rlsPath": "/Users/masaharu/.cargo/bin/rls"`

また、インストール直後は動かない可能性がある
**困ったら　終了 > 再起動**


- 普通のRust拡張機能と Rust(rls)の違い
rls = rust language server
language server は
IDEやエディタに補完機能、構文解析等の機能を統一的に提供するために定められた **langage server protcol** のこと
rlsはそのrust向け実装


# 2. コードを書き始める(Hello world)
1. からのディレクトリを作成
2. `touch hello.ls`
以下のコード
```rust
fn main(){
    println!("Hello, world");
}
```
3. コンパイルする。 `rustc hello.rs`
4. 出力されたバイナリを実行する。 `./hello`


# 3. Cargoプロジェクト作成
パッケージやビルドをプロジェクトとして管理しよう

1. プロジェクト初期化
    a. 新しいプロジェクトフォルダを作る。`cargo new project`
    b. 現在フォルダをプロジェクトにする。`cargo init`
2. プロジェクト内のファイルを確認
1フォルダ、2ファイルのシンプルな構成
src : ソースを置くフォルダ
.gitignore : targetフォルダと .rs.bk だけ

### Cargo.toml
[package] : パッケージ(プロジェクト)の名前やバージョン、作者など
[dependencies] : 依存ライブラリ

vscode の Better Toml 拡張機能を入れるとハイライトされて見やすい

### /target ディレクトリ
コンパイルを実行すると実行ファイルなどが出力されるところ
ソース以外はgithubにプッシュされる必要がないので
ignoreされている


### src/main.rs
エントリーポイント

 # 4. cargo コマンド
 cargoプロジェクト内で使えるコマンド
 
 ## cargo run
 `cargo build` と 出力ファイル実行を同時にする
 
 ## cargo build
 targetフォルダへ、コンパイル結果をデバッグ出力
 
 ## cargo build --release
 リリースビルドする
 
 


# 5. moduleを使う
別ファイルに書いた fn や　class を読み込む
### pub ~
publicな fn や class は別モジュールから呼び出せる
```rust
// print.rs
pub fn run(){
    // print to console
    println!("Hello from the print.rs file");
}
```

呼び出すときは、 mod文でimportして
c++風にネームスペースを指定して使用する
```rust
mod print;

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

`pub` : パブリック修飾子
`mod ファイル名;` : import文


# 6. println関数
println() : 標準関数の一つ。format出力できる

文字列はそのまま出力できる。
数値は {} で 文字列中にフォーマットで出力(数値でも文字列でもできる)
```rust
// print.rs
pub fn run(){

    // print to console
    println!("Hello from the print.rs file");

    // placeholder を使って文字列や数値を出力
    println!("{}", 12345);
    println!("{} is from {}", "Brad", "Mass");
    println!("{0} is from {1} and {0} likes to {2}",
             "Brad", "Mass", "code");
    
    // 名前付き引数
    println!("{name} likes to play {activity}", name = "John", activity="BaseBall");

    // 2, 16, 8, 10進数
    println!("Binary: {:b} Hex: {:x} Octal: {:o} Decimal: {}", 10, 10, 10, 10);

    // タプルを出力(デバッグ用)
    println!("{:?}", (12, true, "hello"));

    // 計算結果出力
    println!("10 + 10 = {}", 10 + 10);
}
```

豆知識.
!! : 直前のコマンドを再現




# 7. 変数
## 変数定義
変数を定義するには　`let` を使う

```rust
pub fn run() {
    let name = "Masaharu";
    println!("My name is {}", name);
}
```

## 再代入
Rustはデフォルトでは再代入を許可しない。
```rust=
// エラーになる
pub fn run() {
    let name = "Masaharu";
    let age = 24;

    // error :  cannot assign twice to immutable variable
    age = 25;

    println!("My name is {} and I am {}", name, age);
}
```

immutableは不変。つまりconst
値を変更する変数は、 **mut** 修飾子をつける
```rust=
pub fn run() {
    let name = "Masaharu";
    let mut age = 24;
    age = 25;
    println!("My name is {} and I am {}", name, age);
}
```


## 定数
**const** を使うと、定数を定義できる。
constもデフォルトletも、どちらも再代入を許さないが
どういう点が違うのか？

### const
- コンパイル前に値が決まっていなければならない
- 型も指定しないといけない
- 宣言と同時に値も指定

### let
- コンパイル時に値が決まってなくてもいい
- 型は自動で推定
- 宣言時に代入しなくていい
- 1回だけ代入できる変数みたいな感じ

```rust=
pub fn run() {
    // const
    const ID: i32 = 001;
    println!("ID: {}", ID);

    // let
    let once;
    once = 24;
    println!("{}", once)
}
```

## マルチ代入
pythonのように、() タプルで複数代入できる
```rust=
pub fn run(){
    let (name, age) = ("masaharu", 24);
    println("{} is {}", name, age);
}
```

# おさらい
## まとめ
- インストール方法
- vscode 拡張
- helloworld
- プロジェクト構成
- cargoコマンド
- module
    - pub
    - mod
- 標準関数 : println()
- 変数
    - let
    - let mut
    - const
    - multi assign
