アンダースコア(Rustの基本構文-3-)

#はじめに
Rustの基本的な文法をまとめてみた。第2回の続きです。
今回は、__アンダーバー"＿"__について。
###目的
Rustにおける基本的な構文の理解をする。
それらを活用したコードの作成。

#Rustの基本構文シリーズ
第1回⇒[Rustの基本構文(1)](https://qiita.com/jin237/items/b344d3a7e6dfe1056e31)　　URL：https://qiita.com/jin237/items/b344d3a7e6dfe1056e31
第2回⇒[Rustの基本構文(2)](https://qiita.com/jin237/items/6910b4f803a35f317213)　　URL:https://qiita.com/jin237/items/6910b4f803a35f317213

#アンダーバーのWarningと実験
第1,2回において、例のコード内にアンダーバーがついているものとついていないものについて、区別がなされているので記載しておきます。

例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.226-例4)
少し前回から改編

まずは、アンダーバーを考えずに書いてみる。

```rust
//例4
//main関数
fn main() {
    shadowing_example();
}
//shadowing関数
fn shadowing_example(){
        let x = 10;
        let x = 20;
        let x ="String";

        println!("{}", x);
        {
            let x = 30;
            println!("{}", x);
        }

        println!("{}", x);
}

```

実行結果

```terminal
[Done] exited with code=0 in 0.822 seconds

[Running] cd "c:\Users\[username]\rust\project1\" && rustc let_function3.rs && "c:\Users\[username]\rust\project1\"let_function3
warning: unused variable: `x`
 --> let_function3.rs:6:13
  |
6 |         let x = 10;
  |             ^ help: consider prefixing with an underscore: `_x`
  |
  = note: `#[warn(unused_variables)]` on by default

warning: unused variable: `x`
 --> let_function3.rs:7:13
  |
7 |         let x = 20;
  |             ^ help: consider prefixing with an underscore: `_x`

String
30
String

[Done] exited with code=0 in 0.625 seconds
```
となり、実行はされるが、Warningが起こってしまう。よくよく見てみると

```terminal
let x = 10;
    ^ help: consider prefixing with an underscore: `_x
```

```terminal
let x = 20;
    ^ help: consider prefixing with an underscore: `_x`
```
のように二つのがコードに対して書いてある。ないようとしては、アンダーバーを"x"の前につけるという内容である。

なので、指示の通りにつけてみる。

```rust
//例4
//main関数
fn main() {
    shadowing_example();
}
//shadowing関数
fn shadowing_example(){
        let _x = 10;
        let _x = 20;
        let x ="String";

        println!("{}", x);
        {
            let x = 30;
            println!("{}", x);
        }

        println!("{}", x);
}
```
実行結果

```terminal
[Running] cd "c:\Users\[username]\rust\project1\" && rustc let_function3.rs && "c:\Users\[username]\rust\project1\"let_function3
String
30
String

[Done] exited with code=0 in 3.437 seconds
```
となり、正常に動いた。

#なぜアンダーバーの要求があるのか
アンダーバーが必要な個所について、ほかのコードも見ながら考えてみた。＝__共通点の捜索__

上記のコード上では、
__println!("")などの変数に対する使用が行われていないとき__発生する。
__シャドウイングでの変数の上書きや隠すという行為があるとき__に使える。
例えば、

```rust
let x = 10;
let x = 20;
```
としたときに"x"の中身は10が20によってシャドウイングされる。この時に、上書き__される側__にアンダーバーを付ける必要がある。そうすることで、何がどう変化したのかが明確になる。Warningが出る理由については、__システム側では推測実行結果となってしまう__ので、__コードを書く人がどういう流れで変化をさせているかを表現する__ということで使える。
なので上記のものは

```rust
let _x = 10;
let x = 20;
```
と書き換える必要がある。

そこで、一番上のコード(例4)に戻ってみる。
fn shadowing_example()の中身について

```rust
//考えない場合
let x = 10;
let x = 20;
let x ="String";

//10⇒20にする場合
let _x = 10;          //10(される側)
let x = 20;           //20(する側)

//20⇒"String"にする場合
let _x = 20;         //20(される側)
let x = "String"     //"String"(する側)

//10⇒20⇒"String"に順に変更していく場合
let _x = 10;
let _x = 20;
let x ="String";
```
と考えられる。

これで、アンダーバーの存在意義、または価値が確立する。

#さいごに
プログラムを書くときにErrorと立ち向かうことが多い。調べてみるのは大事だし、すぐにできるからリサーチ力は非常に大事だが、そのError内容をしっかりとみることも大事だと思う。特にRustのWarningやErrorに関しては、とても分かりやすく書いてあるので、自分で直しやすい。