Freigeben über


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 Rangesein. Wenn itemAccess ein Wert vom Typ Intist, muss der Typ der modification mit dem Elementtyp des Arrays übereinstimmen. Wenn itemAccess ein Wert vom Typ Rangeist, 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 arrneu 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 PauliIfestgelegt sind, mit Ausnahme des Elements bei index i, das auf PauliZfestgelegt ist:

[PauliI, size = n] w/ i <- PauliZ