【MacでRust入門】Rust日本語版チュートリアルの要点まとめ ~ 第5回 変数・定数
目次
こんにちは。
最近流行りのRustを初めてみよう!ということでチュートリアルを読み始めました。
内容を忘れないように & チュートリアルがTL;DRな方向けにブログ記事に要点をまとめていこうと思います。
前回は簡単な数あてゲームを作りました。
今回は第5回です。Rustの変数と定数について要点をまとめます。
Rustの変数がデフォルトで不変なのは何故か?の理由
前回も出てきたように、Rustの変数はデフォルトで不変です。
たとえばこのようなコードは**不変な変数には2回代入できないよ!**と怒られてコンパイルできません。
fn main() {
let x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
なぜ不変がデフォルト、つまりRustで推奨されているのかというと、「その値が今後変わらないことが保証されているので、第三者がコードを読むときの負荷が減るから」ということらしい。つまり、「この宣言された変数が、どこかで書き換わってるかもしれないな〜」と構えながらコードを読む必要がなくなるので、読みやすくなるんですね。変数が「不変である」とわかっていることによって、バグの原因を追うのにも役立ちます。
そして、mut
を書いて可変にすることによって、あえて読者に対して「この変数は将来中身の値が変わりますよ!」という意図を宣言して構えさせるわけです。
これはTypeScriptで極力let
ではなくconst
を使う理由に似ていますね。わかりみが深い。
と思ったらRustにもconst
があるという。↓
Rustの変数と定数の違い
変数ではなく定数の宣言にはconst
を使います。Rustのconst
による定数宣言には必ず型注釈を付ける必要があります。
また、mut
は使えません。(というより必ず不変なので使う必要がない)
さらに、定数は変数と違って定数式(宣言文)にしか使えず、関数の呼び出し結果や実行時に評価される値にはセットできません。
const MAX_POINTS: u32 = 100_000;
必ず型をつけるのはTypeScript(推論させる)とは違いますね。Pythonの通例のように大文字アンダースコアというのは馴染み深い。
Rustのシャドーイングとは?
let
で宣言した変数をさらにlet
で宣言することでシャドーイングし、元の値を2番目の変数で覆い隠すことができます。
mut
で可変にしたのとは違い、シャドーイングしても不変なので再代入するとエラーになります。
fn main() {
let x = 5;
let x = x + 1; // これがシャドーイング x=6になる
{
let x = x * 2; // これもシャドーイング x=12になる
println!("The value of x in the inner scope is: {}", x); // これは12
}
println!("The value of x is: {}", x); // これはx=6
}
シャドーイングは{}
のスコープ内で有効なので、上の例だと最後のx
は6
に戻ります。
前回作成したゲームのコードで使ったように、同じ名前の変数を使いまわして型を変えることができます。
まとめ
というわけで今回はRustの変数と定数の特徴についてまとめました。
let
で宣言する変数はmut
を使って可変にできるが、基本は不変が推奨。const
で定数を宣言できる。命名は大文字アンダースコア。定数は型宣言が必須。let
で同じ名前の変数を再宣言でき、これをシャドーイングという。別の型にするのによく使う。mut
と違って再代入はできない。
次回は変数の色々な型についてまとめます。
それでは〜
Rust オススメの参考書籍
▼ 入門者向け。Pythonとの比較あり。Kindleでも読める。
手を動かして考えればよくわかる 高効率言語 Rust 書きかた・作りかた
▼ 中級者向け。オライリーならではの詳解。硬派な方向け。
参考リンク
Rustチュートリアル (日本語版 非公式) https://doc.rust-jp.rs/book-ja/