C言語マンに分かるようにRustをだらだら書こうぜ。

# ニコチューバーしながらだらだら書く。いいね！が付いている記事を　ちょこちょこ更新する。

誰か読んでるなら　更新しよ……☆（＾～＾）


## C, C#言語の void main() { }

根っこは同じコンピューターなので、実行形式ファイル　は実行できる。
実行形式ファイル というのは単に エントリーポイント があるソースコードのことだぜ。
エントリーポイントが無いソースコードのことを ライブラリ と言う。
Rust言語でも エントリーポイントは main() 関数。

```rust
fn main() {
}

// リターンコードを返したかったら 一手間書ける。
fn main() {
    std::process::exit(0);
}
```



fn は 関数（function）の定義。

とりあえず rustを使い倒すディレクトリーを　どこか１個決めろ。　わたしなら

```
C:\Users\Takahashi\projects_rust
```

にする。　[Windows]+[R]キーからの ```cmd``` 打鍵でもなんでもいいので コマンドプロンプトとか開け。 そして使い倒すディレクトリーをカレントにしろだぜ。
昔は ファイル・エクスプローラーの何もないところを[Shift]+右クリックでコマンドプロンプトに行くメニューがあったんだが 今のわたしのPCは PowerShellが出てしまう。

```
cd C:\Users\Takahashi\projects_rust
```


```
cargo new banana-banana-banana
```

でライブラリ用の banana-banana-banana 作業ディレクトリ作成。 Visual Studioマンなら ソリューションとかプロジェクトとかいうやつになる。 Rustではソリューションとかプロジェクトのことを **クレート(crate)** と呼ぶ。木箱。特に機能はない。cargoが使いやすいディレクトリのことだ。

```
cargo new grape-grape-grape --bin
```

で実行ファイル用の作業ディレクトリ作成。 いつも後ろの --bin を付け忘れてライブラリを作ってしまう。

```
### ビルドをするのは これだが、ほとんど使わない。
cargo build

### クリッピーをセットアップしろだぜ。コーディングの下手くそな部分を指摘してくれる。
cargo clippy
```

でカレントディレクトリをビルド、

```
cargo run
```

でビルドして実行になる。

```
cargo run --example banana
```

とか書くと main.rs ではなく examples/banana.rs が実行されたりする。

# ディレクトリ構成

```
/
|
+--- .git/
|
+--- src/
|
+--- .gitignore
|
+--- Cargo.toml
```

ライブラリでも　実行ファイルでも構成は同じ。
とりあえず　Cargo.toml というテキストファイルを開けだぜ。

```
[package]
name = "lesson_app"
version = "0.1.0"
authors = ["muzudho <muzudho1@gmail.com>"]

[dependencies]
```

[package] と書いてあるところが　自分の情報になる。
name が何になるのかイマイチ法則性が分からん。
モジュールを呼び出すときに使うので、パッケージ名に使えそうな名前に勘で修正しろだぜ。

[dependencies] と書いてあるところが　他のライブラリ（というかクレート）を呼び出すときに書く。クレートの数だけ [dependencies]を書く。
例えば

```
[dependencies.kifuwarabe_shell]
git = "https://github.com/muzudho/rust_kifuwarabe_shell.git"
rev = "6deac338e5ad49992f2f7bfe94c9415bf8382a26"
```

と書いたりする。 git hub のURLと コミットのリビジョン番号を書いておくと
cargo build とかで勝手にダウンロードするから楽。
しかし　調子に乗ってライブラリの依存をいっぱいすると
アプリの中で使用するライブラリは　すべてバージョンが合っている必要がある。
TOML書き直すの　めんどう。

# よその木箱を使う。

TOMLで よその木箱を [dependencies] に並べたなら、ソースファイルでは次の２行を書くだけ。

```
extern crate kifuwarabe_shell;
use kifuwarabe_shell::*;
```

```extern crate``` は、エントリーポイント（main.rsとか）の冒頭だけに１回書けばいい。
```use``` は、クレートの中身を使いたいファイルの冒頭に毎回書く。

# こんなん、やりたいんだろ

```
src
|
+--- main.rs
|
+--- apple.rs
|
+--- white/
|    |
|    +--- banana.rs
|    |
|    +--- casava.rs
|
+--- black/
     |
     +--- dragonfly.rs
     |
     +--- ebifly.rs
```

で、エロ画像フォルダのように整理したい気持ちは分かる。
- mod.rs
- pub mod
- use
使いこなすことでできる。ここで、
- crate は （git hub とかからダウンロードしてくる） 他の木箱
- mod はローカルのディレクトリ、ファイル、ファイルの中のmodスコープ。要は物理的にも論理的にも住所。名前空間。
- use はプログラムに出てくる関数名とか構造体名

と、 **違い** を覚えておけだぜ。もう忘れることはできない。

```
|
+--- main.rs
|
+--- banana.rs
```

例えば main.rs から、 main.rs の隣の banana.rs の中の何かを使いたいときは、

```
mod banana;
use banana::*;
```

とか書く。 mod が分からん。分かる。

```mod``` は、エントリーポイント（main.rsとか）の冒頭だけに１回書けばいい。
ローカルＰＣの中のファイルパスを通している気分になれだぜ。

```
/// サンプルコード main.rs
mod banana;
use banana::*;

fn main() {
    println!("1 + 2 = {}", add(1,2));
}
```

```
/// サンプルコード banana.rs

/// 足すだけ☆（＾～＾）
/// 
/// # Arguments
/// 
/// * `value0` - 左項。
/// * `value1` - 右項。
/// 
/// # Returns
/// 左項＋右項。
pub fn add(value0: i32, value1: i32) -> i32 {
    value0 + value1
}
```

# banana.rs から main.rs の関数呼ぶにはどうすればいいの？

もちろんできる。 ```use *;``` を使う。

```
/// サンプルコード main.rs
mod banana;
use banana::*;

fn main() {
    println!("1 + 2 = {}", add(1, 2));
    println!("11 - 7 = {}", sub_sub(11, 7));
}

/// 引くだけ☆（＾～＾）
/// 
/// # Arguments
/// 
/// * `value0` - 左項。
/// * `value1` - 右項。
/// 
/// # Returns
/// 左項－右項。
pub fn sub(value0: i32, value1: i32) -> i32 {
    value0 - value1
}
```

```
/// サンプルコード banana.rs
use *;

/// 足すだけ☆（＾～＾）
/// 
/// # Arguments
/// 
/// * `value0` - 左項。
/// * `value1` - 右項。
/// 
/// # Returns
/// 左項＋右項。
pub fn add(value0: i32, value1: i32) -> i32 {
    value0 + value1
}

/// 引くだけ☆（＾～＾）
/// 
/// # Arguments
/// 
/// * `value0` - 左項。
/// * `value1` - 右項。
/// 
/// # Returns
/// 左項－右項。
pub fn sub_sub(value0: i32, value1: i32) -> i32 {
    sub(value0, value1)
}
```

なんで ```use main::*;``` ではないのか。 ```use *;``` とか　想像外のところにある気がする。
全部　使えてしまえそうな気さえするが、とりあえず mainの中身を見に行くように動いている気がする。

[Rustの2018年のドキュメント](https://doc.rust-lang.org/book/2018-edition/index.html) のどこに載ってるのかも分からん。

# ディレクトリーで分けたら。

```
src
|
+--- main.rs
|
+--- white/
     |
     +--- banana.rs
     |
     +--- casava.rs
```

こうしたいんだろ。足りてない。

```
src
|
+--- main.rs
|
+--- white/
     |
     +--- banana.rs
     |
     +--- casava.rs
     |
     +--- mod.rs
```

mod.rs が要る。何それ？

```
/// mod.rs の中身。

pub mod banana;
pub mod casava;
```

こんな mod.rs を、各ディレクトリーに入れる。何をやっているのかというと、
公開するファイルを並べていると思えだぜ。

```white/banana.rs``` を使いたいときは、

```
use white::banana::*;
```

と書けだぜ。 white はディレクトリ名じゃないのか、というところだが、 mod.rs ファイルを置いているディレクトリは　名前空間になる感じ。

他には、

```
use banana;
```

とファイル名を決め打ちして、

```
    banana::add(1, 2)
```

と書けば、名前が突合しても　区別することができる。
ぜったい　```banana.add(1, 2)```　と間違えて書くだろ。 C++マンは ```::``` でネームスペースを区切っていると分かるかもしれないが、 C#マンは ```.``` で名前を区切るのに慣れている。



# 誰が読んでるか知らないが。

Rust言語の話しはこっちにも書いている。
[https://qiita.com/muzudho1/items/7d35c3e24db317ebdf08](https://qiita.com/muzudho1/items/7d35c3e24db317ebdf08)