はじめに

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回では「定数」についてまとめていこうと思う。

广告
将在 10 秒后关闭
bannerAds