2.1 変数の本質

変数は「値を格納する箱」と説明されることが多いですが、より正確には、値やメモリ上の場所に付けた名前です。

name = "Taro"

ここではnameという名前から文字列値を参照しています。


2.2 可変と不変

可変変数

一度代入した後も変更できます。

count = 1
count = 2

不変変数

一度値を決めた後、再代入できません。

let count = 1;

// エラー
count = 2;

Rustで変更可能にするには明示します。

let mut count = 1;
count = 2;

JavaScriptでは次の区別があります。

const count = 1;
let total = 0;

現代的な言語設計では、一般に次の考え方が強くなっています。

デフォルトは不変
必要な場所だけ可変

変更可能な状態を減らすと、プログラムの挙動を予測しやすくなるからです。


2.3 再代入と内部変更は別

JavaScriptのconstは、参照先オブジェクトの内部まで不変にするわけではありません。

const user = {
  name: "Taro"
};

user.name = "Jiro"; // 可能

禁止されるのは変数への再代入です。

user = {
  name: "Saburo"
};
// エラー

次の二つは区別しなければなりません。

変数の不変性
オブジェクト内部の不変性

2.4 値型と参照型

値をコピーするときの挙動も重要です。

値を複製する場合

a = 10
b = a

通常、abは独立した整数値として扱われます。

同じオブジェクトを参照する場合

a = [1, 2]
b = a

b.append(3)

print(a)
# [1, 2, 3]

abが同じリストを参照しているためです。

言語を比較するときは、次を確認します。

代入時に値がコピーされるか
参照がコピーされるか
明示的な複製が必要か