やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustの変数(再代入、再宣言(シャドーイング))

 再代入だけでなく再宣言もできる。ややこしいのでまとめる。

変数

  1. 再代入
  2. 再宣言

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でなければシャドーイングできないなどということはない。

対象環境

$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux

前回まで