1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

let式とスコープ、シャドウイング(Rustの基本構文-2-)

Last updated at Posted at 2019-11-22

#はじめに
Rustの基本的な文法をまとめてみた。第1回の続きです。
###目的
Rustにおける基本的な構文の理解をする。
それらを活用したコードの作成。

#Rustの基本構文シリーズ
第1回⇒Rustの基本構文(1)  URL:https://qiita.com/jin237/items/b344d3a7e6dfe1056e31
第3回⇒Rustの基本構文(3)  URL:https://qiita.com/jin237/items/59ef229a4de30cb8203b
#ソースコード(うるう年と平年)
from URL: https://github.com/ghmagazine/rustbook/blob/master/ch06/leap-year/src/main.rs
このコードが基本的なことがいろいろあるので、使用していく。これを紐解くことで理解を深めていく。

// 入力された年がうるう年かどうかを判断するプログラム

// `std::io` 名前空間を `io` としてインポート
use std::io;
// `std::io::Write` トレイトを使う
use std::io::Write;

// エントリポイントとなる関数
fn main() {
    let mut year = String::new();
    print!("Please input a year to check if it is a leap year: ");
    io::stdout().flush().unwrap();
    io::stdin().read_line(&mut year).unwrap();
    let year = year.trim().parse::<u32>().unwrap();

    if is_leap_year(year) {
        println!("{} is a leap year!", year);
    } else {
        println!("{} is not a leap year.", year);
    }
}

// うるう年の場合は `true` 、平年の場合は `false` を返す関数
fn is_leap_year(year: u32) -> bool {
    year % 4 == 0 && !(year % 100 == 0 && year % 400 != 0)
}

#let式(スコープ、シャドウイングなど)
###スコープ
第1回記事にて、変数導入のlet文について基本構文とミュータビリティについて記述した。
その__変数には有効範囲__がある。範囲のことを__スコープ__という。

例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.224,225-例3)

//例3
//main関数
fn main() {
    scope_example();
}
//scope関数
fn scope_example(){
    let _x = 10;
    if _x == 10{
        let y = 20;
        println!("{}", y);
    }
    
    {
        let z = 30;
        println!("{}", z)
    }
    println!("{}", _x);
}

実行結果

[Running] cd "c:\Users\[username]\rust\project1\" && rustc let_function2.rs && "c:\Users\[username]\rust\project1\"let_function2
20
30
10

[Done] exited with code=0 in 3.721 seconds

{ }で囲まれた部分が__ブロック__と呼ばれる部分である。ブロックとは{ }で囲まれたプログラム要素のこと__で、その__範囲内でしか、変数範囲は有効とならない。ただし、一番外側(だいたい関数の最初から)を__グローバルスコープ__と呼ぶ。

###シャドウイング
例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.226-例4)

fn main() {
    shadowing_example();
}

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 0.578 seconds

同じ変数に対して、中身が違うものを入れたときに最後の変数に導入された中身のものが採用される。
さらにはブロック内でスコープが決まっているので、変数記号が同一であっても中身は変わってしまう。
__シャドウイングとは、前に導入した変数を新たに導入した変数で隠してしまうこと__であり、__イメージとしては上書きでいい__と思う。

#最後に
今回載せているコードについても実行できる、または、Warningがない状態で例文を書き換えたものとなっている。書籍その通りには書いていない。このコードでしっかりと理解してほしい。
疑問になりそうなことについて(アンダーバーのことなど)は別記事で。
let文の内容についてはだいたいこれくらいになる。今回は「変数」についてだったので、第3回では「定数」についてまとめていこうと思う。

1
1
0

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?