不変
Int
の変数の再割り当てと、Int[]
型の変数の再割り当てには違いはありません。 次の一連のステートメントについて考えてみましょう。
mutable arr1 = new Int[3];
let arr2 = arr1;
arr1 w/= 0 <- 3;
最初のステートメントは、[0,0,0]
整数の新しい配列をインスタンス化し、arr1
に割り当てます。
次のステートメントでは、名前が arr2
の変数にその値が割り当てられます。 最後のステートメントは、インデックス 0 の値が 3 に設定されている場合を除き、同じ値を持つ arr1
に基づいて新しい配列インスタンスを作成します。 新しく作成された配列は、変数 arr1
に割り当てられます。 最後の行では、の evaluate ステートメントと再割り当てステートメント
3 つのステートメントを実行すると、arr1
には [3,0,0]
値が含まれますが、arr2
は変更されず、[0,0,0]
値が含まれます。
Q# ハンドルの変更可能性と型の動作を明確に区別します。 Q# 内での変更可能性は、型や値ではなく、シンボル に適用される概念です。これは、値自体ではなく値にアクセスできるハンドルに適用されます。 暗黙的または明示的に、型システムで 表現されません。
もちろん、これは正式に定義された行動の説明にすぎません。内部では、実際の実装では参照カウントスキームを使用して、メモリのコピーを可能な限り回避します。 この変更は、特定の値にアクセスする現在有効なハンドルが 1 つしかない限り、具体的に行われます。