#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); // 「このデータは戻り値としてブロックの外で使用されます」と表示する
}