Deklaracje typów
Q# obsługuje typy struct
zdefiniowane przez użytkownika.
struct
typy są podobne do typów rekordów w języku F#; są one niezmienne, ale obsługują konstrukcji kopiowania i aktualizacji.
Typy struktur
struct
typy mogą zawierać tylko nazwane elementy i nie obsługują elementów anonimowych. Obsługiwana jest dowolna kombinacja nazwanych elementów, chociaż nie można zagnieżdżać elementów.
Następująca deklaracja definiuje na przykład Complex
struktury, która ma dwa nazwane elementy Real
i Imaginary
, oba typy Double
:
struct Complex {
Real : Double,
Imaginary : Double,
}
Dostęp do zawartych elementów można uzyskać za pomocą ich nazwy lub dekonstrukcji (aby uzyskać więcej informacji, zobacz dostęp do elementów). Możesz również uzyskać dostęp do krotki wszystkich elementów, w których kształt jest zgodny z elementem zdefiniowanym w deklaracji za pośrednictwem operatora odpakowywanie.
struct
typy są przydatne z dwóch powodów. Po pierwsze, o ile biblioteki i programy korzystające ze zdefiniowanych typów uzyskują dostęp do elementów za pośrednictwem ich nazwy, a nie przez dekonstrukcję, typ można rozszerzyć tak, aby zawierał dodatkowe elementy później bez przerywania kodu biblioteki. W związku z tym uzyskiwanie dostępu do elementów za pośrednictwem dekonstrukcji jest zwykle zniechęcane.
Po drugie, Q# umożliwia przekazanie intencji i oczekiwań dla określonego typu danych, ponieważ nie ma automatycznej konwersji między wartościami dwóch typów struct
, nawet jeśli ich typy elementów są identyczne.
Konstruktory struktury
Konstruktory dla nowych typów struct
są generowane automatycznie przez kompilator podczas odczytywania definicji struct
. W przypadku struktury Complex
w poprzednim przykładzie można utworzyć wystąpienie za pomocą polecenia
let complexPair = Complex(1.4, 2.1);
Wystąpienia mogą być również definiowane przez użytkownika za pomocą słowa kluczowego new
, na przykład
let complexPair = new Complex { Real = 1.4, Imaginary = 2.1 };
Możesz również skopiować istniejącą strukturę za pomocą składni ...
let copyPair = new Complex { ...complexPair };
Podczas kopiowania można określić poszczególne pola do zmiany
let updatedPair = new Complex { ...complexPair, Real = 3.5 };