Kopieren und Aktualisieren von Ausdrücken
Um die Notwendigkeit von änderbaren Bindungen zu verringern, unterstützt Q# Kopier- und Aktualisierungsausdrücke für Arrays, mit denen Sie über einen Index oder einen Bereich von Indizes auf Elemente zugreifen können.
Kopier- und Aktualisierungsausdrücke instanziieren ein neues Array mit allen Elementen, die auf den entsprechenden Wert im ursprünglichen Array festgelegt sind, mit Ausnahme der bestimmten angegebenen Elemente, die auf die auf der rechten Seite des Ausdrucks definierten elemente festgelegt sind.
Sie werden mit einem ternären Operator w/
<-
konstruiert; die Syntax w/
sollte als die häufig verwendete kurze Schreibweise für "with" gelesen werden:
original w/ itemAccess <- modification
wenn original
ein Arrayausdruck ist, ist itemAccess
ein beliebiger Ausdruck, der für die Arrayslicing gültig ist, und modification
ist der neue Wert oder die neuen Werte. Konkret kann der itemAccess
Ausdruck vom Typ Int
oder Range
sein. Wenn itemAccess
ein Wert vom Typ Int
ist, muss der Typ der modification
mit dem Elementtyp des Arrays übereinstimmen. Wenn itemAccess
ein Wert vom Typ Range
ist, muss der Typ der modification
mit dem Arraytyp übereinstimmen.
Wenn z. B. arr
ein Array [0, 1, 2, 3]
enthält, dann
-
arr w/ 0 <- 10
ist das Array[10, 1, 2, 3]
. -
arr w/ 2 <- 10
ist das Array[0, 1, 10, 3]
. -
arr w/ 0..2..3 <- [10, 12]
ist das Array[10, 1, 12, 3]
.
Im Hinblick auf die Rangfolge ist der Copy-and-Update-Operator linksassoziativ und hat die niedrigste Rangfolge, und insbesondere niedrigeren Rang als der Bereichsoperator (..
) oder der ternäre bedingte Operator (?
|
).
Die ausgewählte linke Assoziivität ermöglicht eine einfache Verkettung von Kopier- und Aktualisierungsausdrücken:
let model = ArrayConstructor()
w/ 1 <- alpha
w/ 3 <- gamma
w/ 5 <- epsilon;
Wie bei jedem Operator, der einen Ausdruck desselben Typs erstellt wie der am weitesten links beteiligte Ausdruck, steht die entsprechende evaluate-and-reassign-Anweisung zur Verfügung.
Die beiden folgenden Anweisungen erreichen beispielsweise Folgendes: Die erste Anweisung deklariert eine veränderbare Variable arr
und bindet sie an den Standardwert eines ganzzahligen Arrays. Die zweite Anweisung erstellt dann ein neues Array mit dem ersten Element (mit Index 0), das auf 10 festgelegt ist, und weist es arr
neu zu.
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
arr w/= 0 <- 10; // arr contains [10, 0, 0]
Die zweite Anweisung ist nur kurz für die ausführlichere Syntax arr = arr w/ 0 <- 10;
.
Kopier- und Aktualisierungsausdrücke ermöglichen die effiziente Erstellung neuer Arrays basierend auf vorhandenen Arrays. Die Implementierung für Kopier- und Aktualisierungsausdrücke vermeidet das Kopieren des gesamten Arrays, indem nur die erforderlichen Teile dupliziert werden, um das gewünschte Verhalten zu erzielen und wenn möglich eine direkte Änderung durchzuführen. Daher verursachen Arrayinitialisierungen aufgrund der Unveränderlichkeit keinen zusätzlichen Aufwand.
Der Std.Arrays
Namespace bietet ein Arsenal von praktischen Tools für die Erstellung und Manipulation von Arrays.
Kopier- und Aktualisierungsausdrücke sind eine bequeme Möglichkeit, neue Arrays unterwegs zu erstellen; Der folgende Ausdruck ergibt z. B. ein Array mit allen Elementen, die auf PauliI
festgelegt sind, mit Ausnahme des Elements bei index i
, das auf PauliZ
festgelegt ist:
[PauliI, size = n] w/ i <- PauliZ