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 Range
kan ett nytt uttryck skapas med hjälp av matrisobjektets åtkomstoperator bestående av [
och ]
.
Om uttrycket inom hakparenteserna är av typen Int
innehå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 Range
innehå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.
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för