Déclarations de type
Q# prend en charge les types de struct
définis par l’utilisateur.
struct
types sont similaires aux types d’enregistrements en F# ; ils sont immuables, mais prennent en charge une construction copie et mise à jour.
Types de structs
struct
types ne peuvent contenir que des éléments nommés et ne prennent pas en charge les éléments anonymes. Toute combinaison d’éléments nommés est prise en charge, même si les éléments ne peuvent pas être imbriqués.
La déclaration suivante, par exemple, définit un struct Complex
qui a deux éléments nommés Real
et Imaginary
, tous deux de type Double
:
struct Complex {
Real : Double,
Imaginary : Double,
}
Vous pouvez accéder aux éléments contenus par le biais de leur nom ou par de déconstruction (pour plus d’informations, consultez 'accès aux éléments). Vous pouvez également accéder à un tuple de tous les éléments où la forme correspond à celle définie dans la déclaration via l’opérateur unwrap.
struct
types sont utiles pour deux raisons. Tout d’abord, tant que les bibliothèques et les programmes qui utilisent les types définis accèdent aux éléments via leur nom plutôt qu’en déconstruction, le type peut être étendu pour contenir des éléments supplémentaires ultérieurement sans interrompre le code de bibliothèque. En raison de cela, l’accès aux éléments via la déconstruction est déconseillé.
Deuxièmement, Q# vous permet de transmettre l’intention et les attentes d’un type de données spécifique, car il n’existe aucune conversion automatique entre les valeurs de deux types struct
, même si leurs types d’éléments sont identiques.
Constructeurs de structs
Le compilateur génère automatiquement des constructeurs pour les nouveaux types struct
lorsqu’il lit une définition de struct
. Pour le struct Complex
dans l’exemple précédent, vous pouvez créer une instance avec
let complexPair = Complex(1.4, 2.1);
Vous pouvez également définir des instances avec le mot clé new
, par exemple
let complexPair = new Complex { Real = 1.4, Imaginary = 2.1 };
Vous pouvez copier un struct existant avec la syntaxe ...
let copyPair = new Complex { ...complexPair };
Lors de la copie, vous pouvez spécifier des champs individuels à modifier
let updatedPair = new Complex { ...complexPair, Real = 3.5 };