Dela via


Kopiera och uppdatera-uttryck

För att minska behovet av föränderliga bindningar stöder Q# du kopierings- och uppdateringsuttryck för värdetyper med objektåtkomst. Användardefinierade typer och matriser är båda oföränderliga och tillhör den här kategorin. Med användardefinierade typer kan du komma åt objekt via namn, medan matriser gör att du kan komma åt objekt via ett index eller indexintervall.

Kopiera och uppdatera uttryck instansierar ett nytt värde med alla objekt inställda på motsvarande värde i det ursprungliga uttrycket, förutom vissa angivna objekt, som är inställda på de som definierats till höger om uttrycket. De konstrueras med en ternary-operator w/ <-. Syntaxen w/ bör läsas som den ofta använda korta notationen för "with":

    original w/ itemAccess <- modification

där original är antingen ett uttryck av användardefinierad typ eller ett matrisuttryck. Motsvarande krav för itemAccess och finns i Kopiera och uppdatera användardefinierade typer och Kopiera och uppdatera matrisermodification.

När det gäller prioritet är operatorn copy-and-update vänster associativ och har lägst prioritet, och i synnerhet lägre prioritet än intervalloperatorn (..) eller den villkorsstyrda operatorn ternary (? |). Den valda vänstra associativiteten möjliggör enkel länkning av kopierings- och uppdateringsuttryck:

    let model = Default<SequentialModel>()
        w/ Structure <- ClassifierStructure()
        w/ Parameters <- parameters
        w/ Bias <- bias;

När det gäller alla operatorer som konstruerar ett uttryck av samma typ som det uttryck som används längst till vänster är motsvarande utvärderings- och omtilldelningsuttryck tillgängligt. Följande två instruktioner uppnår till exempel följande: Den första instruktionen deklarerar en föränderlig variabel arr och binder den till standardvärdet för en heltalsmatris. Den andra instruktionen skapar sedan en ny matris med det första objektet (med index 0) inställt på 10 och omtilldelar det till arr.

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

Den andra instruktionen är bara en förkortning för den mer utförliga syntaxen set arr = arr w/ 0 <- 10;.

Kopiera och uppdatera användardefinierade typer

Om värdet original är en användardefinierad typ anger du itemAccess namnet på det objekt som avviker från det ursprungliga värdet. Det här är inte bara ett annat uttryck, som original och modification, eftersom möjligheten att använda objektnamnet utan ytterligare kvalificering är begränsad till den här kontexten. Det är ett av två kontextuella uttryck i Q#.

Typen av modification uttryck måste matcha typen av det namngivna objektet som avviker. Om till exempel complex innehåller värdet Complex(0., 0.), där typen Complex definieras här, så

complex w/ Re <- 1. 

är ett uttryck av typen Complex som utvärderas till Complex(1., 0.).

Kopiera och uppdatera matriser

För matriser itemAccess kan vara ett godtyckligt uttryck av lämplig typ. Samma typer som är giltiga för matrisslicering är giltiga i den här kontexten. Konkret kan uttrycket itemAccess vara av typen Int eller Range. Om itemAccess är ett värde av typen Intmåste typen matcha modification matrisens objekttyp. Om itemAccess är ett värde av typen Rangemåste typen av modification vara samma som matristypen.

Om till exempel arr innehåller en matris [0, 1, 2, 3]kan du

  • arr w/ 0 <- 10 är matrisen [10, 1, 2, 3].
  • arr w/ 2 <- 10 är matrisen [0, 1, 10, 3].
  • arr w/ 0..2..3 <- [10, 12] är matrisen [10, 1, 12, 3].

Med kopierings- och uppdateringsuttryck kan nya matriser skapas effektivt baserat på befintliga. Implementeringen för kopierings- och uppdateringsuttryck undviker att kopiera hela matrisen genom att duplicera endast de nödvändiga delarna för att uppnå önskat beteende och utför en ändring på plats om möjligt. Därför medför matrisinitieringar inte ytterligare omkostnader på grund av oföränderlighet.

Namnområdet Microsoft.Quantum.Arrays innehåller en arsenal av praktiska verktyg för att skapa och manipulera matriser.

Kopierings- och uppdateringsuttryck är ett praktiskt sätt att skapa nya matriser i farten. följande uttryck utvärderas till exempel till en matris med alla objekt inställda PauliIpå , förutom objektet i indexet i, som är inställt PauliZpå :

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