Delen via


Expressies kopiëren en bijwerken

Om de noodzaak van onveranderbare bindingen te verminderen, biedt Q# ondersteuning voor copy-and-update-expressies voor matrices, waarmee u toegang hebt tot items via een index of bereik van indexen.

Met expressies voor kopiëren en bijwerken wordt een nieuwe matrix geïnstitueerd met alle items die zijn ingesteld op de bijbehorende waarde in de oorspronkelijke matrix, met uitzondering van de bepaalde opgegeven items, die zijn ingesteld op de items die aan de rechterkant van de expressie zijn gedefinieerd. Ze worden samengesteld met behulp van een ternaire operator w/<-; de syntaxis w/ moet worden gelezen als de veelgebruikte korte notatie voor "with":

    original w/ itemAccess <- modification

waarbij original een matrixexpressie is, is itemAccess een expressie die geldig is voor matrixlicing en modification de nieuwe waarde of waarden is. Concreet kan de itemAccess expressie van het type Int of Rangezijn. Als itemAccess een waarde van het type Intis, moet het type modification overeenkomen met het itemtype van de matrix. Als itemAccess een waarde van het type Rangeis, moet het type modification hetzelfde zijn als het matrixtype.

Als arr bijvoorbeeld een matrix [0, 1, 2, 3]bevat, dan

  • arr w/ 0 <- 10 is de matrix [10, 1, 2, 3].
  • arr w/ 2 <- 10 is de matrix [0, 1, 10, 3].
  • arr w/ 0..2..3 <- [10, 12] is de matrix [10, 1, 12, 3].

Wat betreft prioriteit is de operator copy-and-update links-associatief en heeft de laagste prioriteit, en met name een lagere prioriteit dan de operator voor het bereik (..) of de ternaire voorwaardelijke operator (?|). Met de gekozen linkse associativiteit kunt u eenvoudig copy-and-update-expressies koppelen:

    let model = ArrayConstructor()
        w/ 1 <- alpha
        w/ 3 <- gamma
        w/ 5 <- epsilon;

Net als bij elke operator waarmee een expressie van hetzelfde type wordt samengesteld als de meest linkse expressie, is de bijbehorende instructie evalueren en opnieuw toewijzen beschikbaar. Met de twee volgende instructies kunt u bijvoorbeeld het volgende bereiken: Met de eerste instructie wordt een veranderlijke variabele arr gede declareert en wordt deze gekoppeld aan de standaardwaarde van een matrix met gehele getallen. Met de tweede instructie wordt vervolgens een nieuwe matrix gebouwd met het eerste item (met index 0) ingesteld op 10 en wordt deze opnieuw toegewezen aan arr.

    mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
    arr w/= 0 <- 10;             // arr contains [10, 0, 0] 

De tweede instructie is slechts kort voor de uitgebreidere syntaxis arr = arr w/ 0 <- 10;.

Met expressies voor kopiëren en bijwerken kunt u nieuwe matrices efficiënt maken op basis van bestaande matrices. De implementatie voor expressies voor kopiëren en bijwerken voorkomt dat de hele matrix wordt gekopieerd door alleen de benodigde onderdelen te dupliceren om het gewenste gedrag te bereiken en indien mogelijk een in-place wijziging uit te voeren. Daarom hebben matrix initialisaties geen extra overhead als gevolg van onveranderbaarheid.

De Std.Arrays naamruimte biedt een arsenaal handige hulpmiddelen voor het maken en bewerken van matrices.

Expressies voor kopiëren en bijwerken zijn een handige manier om snel nieuwe matrices te maken; met de volgende expressie wordt bijvoorbeeld een matrix geëvalueerd met alle items die zijn ingesteld op PauliI, met uitzondering van het item op index i, dat is ingesteld op PauliZ:

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