Dela via


Objektåtkomst

Q# stöder objektåtkomst för matrisobjekt och för objekt i användardefinierade typer. I båda fallen är åtkomsten skrivskyddad. Det går inte att ändra värdet utan att skapa en ny instans med hjälp av ett copy-and-update-uttryck.

Åtkomst till matrisobjekt och matrisssnitt

Givet ett matrisuttryck och ett uttryck av typen Int eller Rangekan ett nytt uttryck skapas med hjälp av matrisobjektets åtkomstoperator bestående av [ och ].

Om uttrycket inom hakparenteserna är av typen Intinnehåller det nya uttrycket matrisobjektet vid det indexet. Om arr till exempel är av typen Double[] och innehåller fem eller fler objekt arr[4] är ett uttryck av typen Double.

Om uttrycket inom hakparenteserna är av typen Rangeinnehåller det nya uttrycket en matris med alla objekt som indexerats av den angivna Range. Range Om är tom är den resulterande matrisen tom. Exempel:

let arr = [10, 11, 36, 49];
let ten = arr[0]; // contains the value 10
let odds = arr[1..2..4]; // contains the value [11, 49]
let reverse = arr[...-1...]; // contains the value [49, 36, 11, 10]

På den sista raden i exemplet har start- och slutvärdet för intervallet utelämnats för enkelhetens skull. Mer information finns i Sammanhangsbaserade uttryck.

Om matrisuttrycket inte är en enkel identifierare måste det omges av parenteser för att kunna extrahera ett objekt eller en sektor. Om till exempel arr1 båda arr2 är heltalsmatriser uttrycks ett objekt från sammanfogningen som (arr1 + arr2)[13]. Mer information finns i Prioritet och associativitet.

Alla matriser i är nollbaserade, d.v.s. det första elementet i Q# en matris arr är alltid arr[0]. Ett undantag utlöses vid körning om indexet eller något av indexen som används för segmentering ligger utanför matrisens gränser, till exempel om det är mindre än noll eller större eller lika med matrisens längd.

Objektåtkomst för användardefinierade typer

(Mer information om hur du definierar anpassade typer som innehåller ett eller flera namngivna eller anonyma objekt finns i Typdeklarationer).

De inneslutna objekten kan nås via deras namn eller genom dekonstruktion, vilket illustreras av följande instruktioner som kan användas som en del av en åtgärd eller funktionsimplementering:

    let complex = Complex(1., 0.); // create a value of type Complex
    let (re, _) = complex!;       // item access via deconstruction
    let im = complex::Imaginary;  // item access via name

Operatorn för objektåtkomst (::) hämtar namngivna objekt, vilket illustreras i följande exempel:

newtype TwoStrings = (str1 : String, str2 : String);

operation LinkTwoStrings(str : TwoStrings) : String {
    let s1 = str::str1;
    let s2 = str::str2;
    return s1 + s2;
}

Namngivna objekt kan nås med deras namn eller via dekonstruktion, men anonyma objekt kan bara nås av det senare. Eftersom dekonstruktionen förlitar sig på alla inneslutna objekt avråder du från att använda anonyma objekt när dessa objekt behöver nås utanför kompileringsenheten där typen har definierats.

Åtkomst via dekonstruktion använder unwrap-operatorn (!). Operatorn unwrap returnerar en tuppel med alla inneslutna objekt, där tuppelns form matchar den som definierats i deklarationen och en enskild objekttuppel motsvarar själva objektet (se det här avsnittet).

Till exempel för ett värde nested av typen Nested som definieras på följande sätt

newtype Nested = (Double, (ItemName : Int, String));

uttrycket nested! returnerar ett värde av typen (Double, (Int, String)).

Operatorn ! har lägre prioritet än båda objektåtkomstoperatorerna, men högre prioritet än någon annan operator. En fullständig lista över prioriteter finns i Prioritet och associativitet.