Rustの変数(再代入、再宣言(シャドーイング))
再代入だけでなく再宣言もできる。ややこしいのでまとめる。
変数
- 再代入
- 再宣言
1. 再代入
1-0. イミュータブル
let x = 0; x = 1; // error[E0384]: cannot assign twice to immutable variable `x`
mut
(ミュータブル)で宣言しないと再代入できずコンパイルエラーになる。
let mut x = 0; x = 1; // OK!
1-1. 同型
let mut x = 0; x = "a"; // error[E0308]: mismatched types
再代入するときは同一の型でなければならない。もし宣言時と異なる型を再代入したら以下エラーとなる。
1-2. 異型
let mut x = 0; x = "a"; // error[E0308]: mismatched types
Rustの変数は同型しか再代入を受け付けない。
2. シャドーイング
シャドーイングとは、同名の変数が宣言されたとき、前の変数を隠す(参照できなくする)機能である。
2-1. 同型
let x = 0; let x = 1;
2行目はlet
により同名の変数を再宣言している。2つとも別々の変数として扱われる。ただし前者を参照できるのは後者が宣言される直前の行まで。
let x = 0; println("first x = {}", x); let x = 1; println("second x = {}", x);
シャドーイングする必要性がない。再代入したほうが良さそう。
でも、このコードも書けてしまう。バット・イディオム? 気づかずに同名の変数を再宣言してしまったとき、バグに気づきにくいか。コンパイルエラーにならないから。ユニットテストのときにシャドーイングにより上書きされてしまっていることに気付けるかどうか。
2-2. 異型
Rustでは異なる型を再代入すると型エラーになる。その要件を満たすには再宣言してシャドーイングさせる。
let x = 0; let x = "a";
シャドーイングを用いれば、同じ意味を持つが異なる型のとき、同名の変数をつくれる。これは便利。C#などの言語では別名が必要。
let mut x = 0; let x = "a";
mut
の有無はシャドーイングに影響しない。前者は再代入できるし、後者はできない。それぞれ個別の変数であるため、前者がmut
でなければシャドーイングできないなどということはない。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.34.2 (6c2484dc3 2019-05-13)
- cargo 1.34.0 (6789d8a0a 2019-04-01)
$ uname -a Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux
前回まで
- Rustを学んでみたい(プログラミング言語)
- Rustの環境構築
- RustでHelloWorld
- Rustの和訳ドキュメント
- Cargoでプロジェクト作成・ビルド・実行
- クレートとは?
- Rustで関数を使ってみる
- Rustでモジュールを使ってみる
- Rustで乱数を生成する(rand)
- Rustで標準入力する(std::io::stdin().read_line())
- RustでMatch判定する(match)
- Rustでprintとread_lineを1行にする方法
- Rustで数当てゲーム
- クレート名にドット.が使えない
- Rustの変数と可変性(let, mut) error[E0384]: cannot assign twice to immutable variable
x
- Rustのimmutable束縛とconst定数の違い
- RustのREPL、evcxrのインストールに失敗した
- Rustでコンパイルするときの変数未使用warningを消す