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

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 };