【初心者入門】Rustのuse、extern create、mod、struct、implについて

# アクセス修飾子

- Rustでの`public`は`pub` になって`private`の場合は先頭は何もなしで`private` 扱いになる

    ```rust
    // public
    pub fn 関数名 { 
    }

    pub mod モジュール名 { 
    }

    // private
    fn 関数名 { 
    }

    mod モジュール名 { 
    }
    ```

# struct、implについて

- Rustにはclassがないため、代わりに `struct`、 `impl`、 `trait`を使用する

【struct】

- `struct`とは構造体を定義する時に使用する
    - 構造体とは異なる型のデータをひとまとめにしたもの
    - データ名と型を構造体の中に定義する

    ```rust
    struct user {
      pub name: String,
    }
    ```

【impl】

- `impl` は`struct`上で動作する関数を定義することができる
    - `impl`は、`struct`と同名にすることで `struct`の`Apple`に対して実装を行ってるという認識になる

    ```rust
    pub struct Animal {
        pub name: String
    }

    impl Animal {
        pub fn get_name(&self) -> &str {
            &self.name
        }
    }
    ```

    ```rust
    use web_app::models::users::Animal;

    fn main() -> (){
        let animal = Animal { name: "ゴリラ".to_string()};
        println!("{}", Animal::get_name(&animal));
    }
    ```

# use、extern create、modについて

【extern crate】

- 外部のクレート(ライブラリ)をインポートする時に使う
- `lib.rs` に定義するだけで基本的には使用できるようになる

```rust
extern crate diesel;
```

【mod】

- モジュールとは機能の集まりで関数、モジュールがまとめられている
- モジュールの定義には3つある
   - `mod モジュール名 { … }` で定義
   - 同じファイル内で`mod` を定義して使用する
   
         ```rust
         // モジュール定義
         pub mod my_mod {
    	 // 関数の定義
         pub fn log(a: &str) {
           // ターミナルに引数でもらった値を表示
           println!("{}",a);
         }
        }
       fn main() -> (){
    	// 上記のmy_modのlog関数を利用
        my_mod::log("テスト 太郎");
       }
       ```

- `モジュール名.rs` を作って `lib.rs` に `pub mod モジュール名` と書いて定義する。つまりファイルからモジュールを定義する。
    - 別ファイルでモジュールを定義

        ```rust
        // モジュール定義
        pub mod my_mod {
        	// 関数の定義
          pub fn log(a: &str) {
        		// ターミナルに引数でもらった値を表示
            println!("{}",a);
          }
        }
        ```

    - `lib.rs`で下記のように`mod` を定義

        ```rust
        pub mod sample;
        ```

    - `main.rs` で`use`を扱って読み込んで使用
        - 今回の場合のパスは`プロジェクト名/ファイル名/モジュール名`

        ```rust
        use web_app::sample::my_mod; 

        fn main() -> (){
            my_mod::log("テスト 太郎 ");
        }
        ```

- `モジュール名/mod.rs` を作って、`lib.rs` に`pub mod モジュール名` と書いて定義する
    - 新しくディレクトリを作成してその配下に`mod.rs` を作成して`mod`を定義

        ```rust
        pub mod sample;
        ```

    - さらに作成したディレクトリ配下に`モジュール名.rs` を作成して`mod`を定義

        ```rust
        // モジュール定義
        pub mod my_mod {
        	// 関数の定義
          pub fn log(a: &str) {
        		// ターミナルに引数でもらった値を表示
            println!("{}",a);
          }
        }
        ```

    - `main.rs` で`use`を扱って読み込んで使用

        ```rust
        use web_app::sample_mods::sample::my_mod;

        fn main() -> (){
            my_mod::log("テスト 太郎");
        }
        ```
【use】

- `use`は各ファイルで`モジュール`、`ライブラリ`などの`インポート`時に利用する
- 別ファイルで定義しているモジュールを使いたい場合に使用

    ```rust
    use web_app::sample::my_mod

    fn main() -> (){
        my_mod::log("テスト 太郎");
    }
    ```

- ライブラリなども同様で`use`でパスを指定すれば使用する事ができる

    ```rust
    use web_app::sample::my_mod
    use chrono::Local;

    fn main() -> (){
        my_mod::log("テスト 太郎");
    		// 現在の日付と時刻を表示
        println!("{}", Local::now());
    }
    ```

- 使用したライブラリ

https://docs.rs/chrono/0.4.19/chrono/

- パスについて
    - 先頭に`create` 、`プロジェクト名`  、`ライブラリ名` などで始まるパスは`絶対パス`
    - `self` か `super` で始まるパスは`相対パス`
    - 下記のリンクにもパスについて記載がある

https://doc.rust-jp.rs/book-ja/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html

- `as` で名前を変更することも可能

    ```rust
    use web_app::sample::my_mod as test;

    fn main() -> (){
        test::log("テスト 太郎");
    }
    ```

# まとめ

- `struct`は構造体
- `impl`を利用する事で`struct` に動作を実装する事ができる
- 外部のクレート(ライブラリ)を使用する場合は`lib.rs` に`extern crate クレート名`
- モジュールは`pub mod モジュール名{ 関数、モジュール }` で詳細を定義して `lib.rs` or `mod.rs` に `pub mod モジュール名` で定義して`use` で使用ができる
- `use` は絶対パスか相対パスでモジュールやライブラリをインポートして使用する事ができる