Объявления типов
Q# поддерживает пользовательские типы. Пользовательские типы похожи на типы записей в F#: они неизменяемы, но поддерживают конструкцию копирования и обновления.
Определяемые пользователем типы
Пользовательские типы могут одновременно содержать именованные и анонимные элементы.
Следующее объявление в пространстве имен, например, определяет тип Complex
, который имеет два именованных элемента — Real
и Imaginary
— с типом Double
:
newtype Complex = (Real: Double, Imaginary : Double);
Поддерживается любое сочетание именованных и неименованных элементов, при этом внутренние элементы также могут быть именованными.
Например, тип Nested
, определенный как
newtype Nested = (Double, (ItemName : Int, String));
содержит два автономных элемента типа Double
и String
соответственно, а именованный элемент ItemName
имеет тип Int
.
Вы можете получить доступ к содержащимся элементам по их имени или с помощью деконструирования (дополнительные сведения см. в разделе о доступе к элементам). Вы также можете получить доступ к кортежу всех элементов, в котором форма соответствует форме, определенной в объявлении с помощью оператора распаковки.
Пользовательские типы полезны по двум причинам. Во-первых, тип можно расширить для последующего включения дополнительных элементов без нарушения работы кода библиотеки, если библиотеки и программы, использующие определенные типы, получают доступ к элементам по их имени, а не через деконструирование. По этой причине доступ к элементам через деконструирование обычно не рекомендуется.
Во-вторых, Q# позволяет передать намерение и ожидания для определенного типа данных, так как отсутствует автоматическое преобразование между значениями двух пользовательских типов, даже если их типы элементов одинаковы.
Пользовательские конструкторы
Конструкторы для пользовательских типов создаются компилятором автоматически. В настоящее время нельзя определить пользовательский конструктор, хотя возможно, что мы добавим эту функцию в будущем.