Dostęp do elementów
Q# obsługuje dostęp do elementów tablicy i typów struct
. W obu przypadkach dostęp jest tylko do odczytu; nie można zmienić wartości bez tworzenia nowego wystąpienia przy użyciu wyrażenia copy-and-update.
Dostęp do elementu tablicy i fragmentowanie tablic
Biorąc pod uwagę wyrażenie tablicy i wyrażenie typu Int
lub Range
, można utworzyć nowe wyrażenie przy użyciu operatora dostępu do elementu tablicy składającego się z [
i ]
.
Jeśli wyrażenie wewnątrz nawiasów jest typu Int
, nowe wyrażenie zawiera element tablicy w tym indeksie.
Jeśli na przykład arr
jest typu Double[]
i zawiera pięć lub więcej elementów, arr[4]
jest wyrażeniem typu Double
.
Jeśli wyrażenie wewnątrz nawiasów jest typu Range
, nowe wyrażenie zawiera tablicę wszystkich elementów indeksowanych przez określony Range
. Jeśli Range
jest pusta, wynikowa tablica jest pusta.
Na przykład
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]
W ostatnim wierszu przykładu wartość początkowa i końcowa zakresu została pominięta dla wygody. Aby uzyskać więcej informacji, zobacz Wyrażenia kontekstowe.
Jeśli wyrażenie tablicy nie jest prostym identyfikatorem, musi być ujęte w nawiasy w celu wyodrębnienia elementu lub wycinka.
Jeśli na przykład arr1
i arr2
są tablicami liczb całkowitych, element z łączenia zostanie wyrażony jako (arr1 + arr2)[13]
. Aby uzyskać więcej informacji, zobacz Pierwszeństwo i kojarzenie.
Wszystkie tablice w Q# są oparte na zera, czyli pierwszym elementem tablicy arr
jest zawsze arr[0]
.
Wyjątek jest zgłaszany w czasie wykonywania, jeśli indeks lub jeden z indeksów używanych do fragmentowania znajduje się poza granicami tablicy, na przykład jeśli jest mniejszy niż zero lub większy lub równy długości tablicy.
Dostęp do elementów dla typów struktur
Dostęp do zawartych elementów w struct
można uzyskać na dwa sposoby:
- Przy użyciu kropki (
.
) - Dekonstrukcja przy użyciu operatora
unwrap
(!
).
Na przykład biorąc pod uwagę Complex
struktury
struct Complex {
Real : Double,
Imaginary : Double,
}
// create an instance of type Complex
let complex = Complex(1., 0.);
// item access via deconstruction
let (re, _) = complex!;
// item access via name reference
let im = complex.Imaginary;
Dostęp za pośrednictwem dekonstrukcji korzysta z operatora unwrap (!
). Operator unwrap zwraca krotkę wszystkich zawartych elementów, gdzie kształt krotki jest zgodny z elementem zdefiniowanym w deklaracji, a pojedyncza krotka elementu jest równoważna samemu elementowi (zobacz tej sekcji).
Operator !
ma niższy pierwszeństwo niż oba operatory dostępu do elementów, ale wyższy priorytet niż jakikolwiek inny operator. Aby uzyskać pełną listę pierwszeństwa, zobacz Pierwszeństwo i kojarzenie.
Aby uzyskać więcej informacji na temat składni dekonstrukcji, zobacz Deklaracje zmiennych i ponowne przypisywanie.