Freigeben über


Elementzugriff

Q# unterstützt den Elementzugriff für Arrayelemente und für Elemente in benutzerdefinierten Typen. In beiden Fällen ist der Zugriff schreibgeschützt. Der Wert kann also nicht geändert werden, ohne eine neue Instanz mithilfe eines Copy-and-Update-Ausdrucks zu erstellen.

Arrayelementzugriff und Arrayaufteilung

Bei einem Arrayausdruck und einem Ausdruck vom Typ Int oder Range kann ein neuer Ausdruck mithilfe des Arrayelementzugriffsoperators gebildet werden, der aus [ und ] besteht.

Wenn der Ausdruck in den Klammern den Typ Int aufweist, enthält der neue Ausdruck das Arrayelement an diesem Index. Wenn also beispielsweise arr den Typ Double[] aufweist und fünf oder mehr Elemente enthält, ist arr[4] ein Ausdruck vom Typ Double.

Wenn der Ausdruck innerhalb der Klammern den Typ Range aufweist, enthält der neue Ausdruck ein Array mit allen Elementen, die durch den angegebenen Bereich (Range) indiziert sind. Wenn Range leer ist, ist auch das resultierende Array leer. Beispiel:

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]

In der letzten Zeile des Beispiels wurden der Einfachheit halber der Start- und Endwert des Bereichs weggelassen. Weitere Informationen finden Sie unter Kontextbezogene und ausgelassene Ausdrücke.

Wenn der Arrayausdruck kein einfacher Bezeichner ist, muss er in Klammern eingeschlossen werden, um ein Element oder einen Slice zu extrahieren. Wenn z. B. arr1 und arr2 beide Arrays von ganzen Zahlen sind, wird ein Element aus der Verkettung als (arr1 + arr2)[13] ausgedrückt. Weitere Informationen finden Sie unter Rangfolge und Assoziativität.

Alle Arrays in Q# sind nullbasiert. Das erste Element eines Arrays vom Typ arr ist also immer arr[0]. Zur Laufzeit wird eine Ausnahme ausgelöst, wenn sich der Index oder einer der für die Aufteilung verwendeten Indizes außerhalb der Grenzen des Arrays befindet – also beispielsweise, wenn er kleiner null oder größer oder gleich der Länge des Arrays ist.

Elementzugriff für benutzerdefinierte Typen

(Weitere Informationen zum Definieren benutzerdefinierter Typen mit einem oder mehreren benannten oder anonymen Elementen finden Sie unter Typdeklarationen.)

Auf die enthaltenen Elemente kann über ihren Namen oder durch Dekonstruktion zugegriffen werden, was durch die folgenden Anweisungen veranschaulicht wird, die als Teil einer Vorgangs- oder Funktionsimplementierung verwendet werden können:

    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

Der Elementzugriffsoperator (::) ruft benannte Elemente ab, wie im folgenden Beispiel veranschaulicht:

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

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

Auf benannte Elemente kann zwar über ihren Namen oder über Dekonstruktion zugegriffen werden, auf anonyme Elemente kann jedoch nur über letzteres zugegriffen werden. Da die Dekonstruktion von allen enthaltenen Elementen abhängt, wird die Verwendung anonymer Elemente abgeraten, wenn auf diese Elemente außerhalb der Kompilierungseinheit zugegriffen werden muss, in der der Typ definiert ist.

Für den Zugriff über Dekonstruktion wird der Unwrap-Operator (!) verwendet. Der Unwrap-Operator gibt ein Tupel aller enthaltenen Elemente zurück, wobei die Form des Tupels mit dem in der Deklaration definierten Tupel übereinstimmt und ein einzelnes Elementtupel dem Element selbst entspricht. (Weitere Informationen finden Sie in diesem Abschnitt.)

Hier sehen Sie ein Beispiel für einen Wert (nested) vom Typ Nested, der wie folgt definiert ist:

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

Der Ausdruck nested! gibt einen Wert vom Typ zurück (Double, (Int, String)).

Der !-Operator hat eine niedrigere Rangfolge als beide Elementzugriffsoperatoren, aber eine höhere Rangfolge als jeder andere Operator. Eine vollständige Liste der Rangfolgen finden Sie unter Rangfolge und Assoziativität.