次の方法で共有


不変

内のすべての型は、値型です。 Q# には、参照またはポインターの概念がありません。 代わりに、代入式を使用して、以前に宣言された変数に新しい値を再割り当てできます。 たとえば、型 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 つしかない限り、具体的に行われます。