Поделиться через


Объявления типов

Q# поддерживает определяемые пользователем типы struct. struct типы похожи на типы записей в F#; они неизменяемы, но поддерживают конструкцию копирования и обновления.

Типы структур

struct типы могут содержать только именованные элементы и не поддерживают анонимные элементы. Поддерживается любое сочетание именованных элементов, хотя элементы не могут быть вложены.

Например, следующее объявление определяет структуру Complex с двумя именованными элементами Real и Imaginaryтипа Double:

struct Complex {
    Real : Double,
    Imaginary : Double,
}

Доступ к содержащимся элементам можно получить с помощью их имени или деконструкции (дополнительные сведения см. в доступа к элементам). Вы также можете получить доступ к кортежу всех элементов, где фигура совпадает с фигурой, определенной в объявлении, с помощью оператора распаковки.

struct типы полезны по двум причинам. Во-первых, если библиотеки и программы, использующие определенные типы, обращаются к элементам через их имя, а не деконструкция, тип можно расширить, чтобы содержать дополнительные элементы позже без нарушения кода библиотеки. Из-за этого доступ к элементам через деконструкцию обычно не рекомендуется.

Во-вторых, Q# позволяет передавать намерения и ожидания для определенного типа данных, так как автоматическое преобразование между значениями двух struct типов, даже если их типы элементов идентичны.

Конструкторы структуры

Конструкторы для новых типов struct автоматически создаются компилятором при чтении определения struct. Для структуры Complex в предыдущем примере можно создать экземпляр с помощью

let complexPair = Complex(1.4, 2.1);

Экземпляры также можно определить пользователем с помощью ключевого слова new, например

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

Можно также скопировать существующую структуру с помощью синтаксиса ...

let copyPair = new Complex { ...complexPair };

При копировании можно указать отдельные поля для изменения

let updatedPair = new Complex { ...complexPair, Real = 3.5 };