コピーと更新の式
変更可能なバインドの必要性を減らすために、Q# は配列のコピー式と更新式をサポートしています。これにより、インデックスまたはインデックスの範囲を介して項目にアクセスできます。
コピーおよび更新式は、指定された特定の項目を除き、元の配列内のすべての項目が対応する値に設定された新しい配列をインスタンス化します。ただし、この項目は式の右側で定義されたものに設定されます。
これらは、w/
<-
三項演算子を使用して構築されます。構文 w/
は、"with" の一般的に使用される短い表記として読み取る必要があります。
original w/ itemAccess <- modification
ここで、original
は配列式で、itemAccess
は配列のスライスに有効な任意の式であり、modification
は新しい値です。 具体的には、itemAccess
式は、Int
型または Range
型にすることができます。
itemAccess
が Int
型の値である場合、modification
の型は配列の項目型と一致する必要があります。
itemAccess
が Range
型の値である場合、modification
の型は配列型と同じである必要があります。
たとえば、arr
に配列 [0, 1, 2, 3]
が含まれている場合、次のようになります。
-
arr w/ 0 <- 10
は配列[10, 1, 2, 3]
です。 -
arr w/ 2 <- 10
は配列[0, 1, 10, 3]
です。 -
arr w/ 0..2..3 <- [10, 12]
は配列[10, 1, 12, 3]
です。
優先順位の観点では、コピーと更新の演算子は左連想であり、優先順位が最も低く、特に、範囲演算子 (..
) または三項条件演算子 (?
|
) よりも優先順位が低くなります。
選択した左結合規則を使用すると、コピーと更新の式を簡単に連結できます。
let model = ArrayConstructor()
w/ 1 <- alpha
w/ 3 <- gamma
w/ 5 <- epsilon;
関係する左端の式と同じ型の式を構築する演算子については、対応する evaluate-and-reassign ステートメント を使用できます。
たとえば、次の 2 つのステートメントを実行します。最初のステートメントは、変更可能な変数 arr
を宣言し、整数配列の既定値にバインドします。 次に、2 番目のステートメントは、最初の項目 (インデックス 0) を 10 に設定して新しい配列を作成し、arr
に再割り当てします。
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
arr w/= 0 <- 10; // arr contains [10, 0, 0]
2 番目のステートメントは、より詳細な構文 arr = arr w/ 0 <- 10;
の簡単な説明です。
コピーおよび更新式を使用すると、既存の配列に基づいて新しい配列を効率的に作成できます。 コピーおよび更新式の実装では、必要な動作を実現するために必要な部分のみを複製して配列全体をコピーすることを回避し、可能であればインプレース変更を実行します。 そのため、配列の初期化では、不変性のために追加のオーバーヘッドは発生しません。
Std.Arrays
名前空間は、配列の作成と操作に便利なツールを提供します。
コピーと更新の式は、新しい配列をその場で構築するのに便利な方法です。たとえば、次の式は、PauliZ
に設定されているインデックス i
の項目を除き、すべての項目が PauliI
に設定された配列に評価されます。
[PauliI, size = n] w/ i <- PauliZ