Udostępnij za pośrednictwem


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 nie zaleca się uzyskiwania dostępu do elementów za pośrednictwem dekonstrukcji.

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

Kompilator automatycznie generuje konstruktory dla nowych typów struct 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);

Możesz również zdefiniować wystąpienia za pomocą słowa kluczowego new, na przykład

let complexPair = new Complex { Real = 1.4, Imaginary = 2.1 };

Istniejącą strukturę można skopiować 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 };