Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

変数

let

変数とは、データの所有者です。箱でも名前でもないです。
「どの変数が持っているデータなのか」という観点がRustでは重要なので、変数は所有者と考えましょう。

書き方は以下の通りです。
let 変数名 = データ
以降は変数名を書くだけで中身のデータを扱うことが出来ます。

fn main(){
    let price = 100; //リンゴの値段 変数priceは100というデータを持っている
    println!("リンゴの値段は{}円です。",price); //変数名を書くとデータに置き換わる。100と書いたのと同じ。

    let name = "Rust太郎"; //名前 変数nameは"Rust太郎"というデータを持っている
    println!("私の名前は{}です。",name);

    let PI = 3.14; //円周率
    println!("円周率は{}です。",PI);

    let answer = 3 * 4 + 2; //変数answerは計算結果を持っている
    println!("3 * 4 + 2 = {}",answer);
}

実行結果

リンゴの値段は100円です。
私の名前はRust太郎です。
円周率は3.14です。
3 * 4 + 2 = 14

シャドーイング

既に存在する変数名でletすることが出来ます。
同名の新しい変数が作成され、古い変数は使用できなくなります。
後述のmutを使うよりもこの方法をまず検討したほうが良いと思われます。

fn main() {
    let x = 100;        // 100を変数xに束縛
    println!("{}",x );  // 100と表示する

    let x = 200;        // xをシャドーイング
    println!("{}",x );  // 200と表示する

    let x = 3.14 as f32;// 型が違っても良い
    println!("{}", x);
}

mut

letの直後にmutと書くと中身を変更できる変数になります。
変更可能であることを「ミュータブル」、変更不可能であることを「イミュータブル」といいます。
let mut 変数名 = データ

変数の中身を変更するときは以下のように書きます。これを代入といいます。
変数名 = 新しいデータ

fn main(){
    let mut price = 100;//リンゴの値段 priceは変更可能。
    println!("リンゴの値段は{}円です。",price);

    price = 200; //リンゴの値段を変更する
    println!("リンゴの値段は{}円です。",price);
}

実行結果

リンゴの値段は100円です。
リンゴの値段は200円です。

変更可能なのでどんなデータを持っているか常に気を付けていなければいけません。
いつ、どこで、どんなデータを代入したのかを把握しておく必要があります。
ミュータブルにする利点は、変数の作成にかかるコストを回避できることです。

ブロックとスコープ

{}に囲まれたコードをブロック(塊)と呼びます。
ブロックで囲まれた範囲をスコープ(範囲)と呼びます。
あるブロックで作成された変数は、そのブロックを出るときに破棄されます。

fn main() {
    let outer = "outer"; // スコープはmain関数
    println!("{}",outer );

    {
        let inner = "inner"; // スコープはこのブロックの中
        println!("{}",inner);
    }// innerはここで破棄される

    println!("{}", outer); // outerはまだ生きている
    // println!("{}", inner); // innerはすでに破棄されているのでコンパイルエラーになる
}

スコープの仕組みを利用して、一時的なシャドーイングをすることが出来ます。

fn main() {
    let x = 100;        // 100を変数xに束縛
    println!("{}", x);  // 100と表示する
    {
        let x = 200;        // xをシャドーイング 外側のxが無くなるわけではない
        println!("{}", x);  // 200と表示する
    } // ここで内側のxが破棄される

    println!("{}", x); // シャドーイングしていた変数が破棄されたので、再び100と表示する
}

ブロックの最後に書かれた式やデータは、そのブロックの戻り値となります。
戻り値となったデータはブロックから出ることが出来、破棄されません。

fn main() {
    // ブロックの戻り値を変数に束縛
    let value_of_block = {
        let inner = "このデータは破棄されます";
        let return_value = "このデータはブロックの外で使用されます";

        return_value // これが戻り値となる セミコロン「;」を書いていないことに注意
    };

    println!("{}", value_of_block); // 「このデータは戻り値としてブロックの外で使用されます」と表示する
}

目次

tonesuke
頭の体操として趣味でプログラミングを勉強したり書いたりしてる人です。今はRustを勉強中です。一応本業でもプログラミングしてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away