LoginSignup
6
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-22

はじめに

Rustの基本的な文法をまとめてみた。第2回の続きです。
今回は、アンダーバー"_"について。

目的

Rustにおける基本的な構文の理解をする。
それらを活用したコードの作成。

Rustの基本構文シリーズ

第1回⇒Rustの基本構文(1)  URL:https://qiita.com/jin237/items/b344d3a7e6dfe1056e31
第2回⇒Rustの基本構文(2)  URL:https://qiita.com/jin237/items/6910b4f803a35f317213

アンダーバーのWarningと実験

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

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

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

//例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);
}

実行結果

[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が起こってしまう。よくよく見てみると

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

のように二つのがコードに対して書いてある。ないようとしては、アンダーバーを"x"の前につけるという内容である。

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

//例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);
}

実行結果

[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!("")などの変数に対する使用が行われていないとき発生する。
シャドウイングでの変数の上書きや隠すという行為があるときに使える。
例えば、

let x = 10;
let x = 20;

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

let _x = 10;
let x = 20;

と書き換える必要がある。

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

//考えない場合
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に関しては、とても分かりやすく書いてあるので、自分で直しやすい。

6
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4