一時的なミュータビリティ
説明
あるデータを準備・処理する必要があり、いったんそれが済めば、データは参照されるだけであり、変更されることはない、という状況がよくあります。このような状況では、可変変数を不変変数として再定義することで、その意図を明示することができます。
これは、ネストされたブロック内でデータを処理することか、変数を再束縛することで実現できます。
例
ベクタが使用される前にソートする必要がある、という状況を考えましょう。
ネストされたブロックを使う場合:
let data = {
let mut data = get_vec();
data.sort();
data
};
// ここで `data` は不変である。
変数の再束縛を使う場合:
let mut data = get_vec();
data.sort();
let data = data;
// ここで `data` は不変である。
長所
ある時点以降にデータを誤って変更してしまうことを、コンパイラが防ぎます。
短所
ネストされたブロックは、ブロックの本体に追加のインデントが必要になります。ブロックからデータを返したり、変数を再定義するに、追加の1行が必要です。