Typedeclaraties
Q# ondersteunt door de gebruiker gedefinieerde typen struct
.
struct
typen zijn vergelijkbaar met recordtypen in F#; ze zijn onveranderbaar, maar ondersteunen een -constructie voor kopiƫren en bijwerken.
Struct-typen
struct
typen mogen alleen benoemde items bevatten en bieden geen ondersteuning voor anonieme items. Elke combinatie van benoemde items wordt ondersteund, hoewel items niet kunnen worden genest.
De volgende declaratie definieert bijvoorbeeld een struct-Complex
met twee benoemde items Real
en Imaginary
, beide van het type Double
:
struct Complex {
Real : Double,
Imaginary : Double,
}
U kunt de ingesloten items openen via hun naam of door deconstructie (zie itemtoegangvoor meer informatie). U kunt ook toegang krijgen tot een tuple van alle items waarbij de shape overeenkomt met de shape die in de declaratie is gedefinieerd via de operator uitpakken.
struct
typen zijn om twee redenen nuttig. Ten eerste, zolang de bibliotheken en programma's die gebruikmaken van de gedefinieerde typen toegang krijgen tot items via hun naam in plaats van door deconstructie, kan het type worden uitgebreid om later extra items te bevatten zonder dat er bibliotheekcode wordt onderbroken. Daarom wordt het openen van items via deconstructie over het algemeen afgeraden.
Ten tweede kunt u met Q# de intentie en verwachtingen voor een specifiek gegevenstype overbrengen, omdat er geen automatische conversie is tussen waarden van twee struct
typen, zelfs als de itemtypen identiek zijn.
Struct-constructors
Constructors voor nieuwe struct
typen worden automatisch gegenereerd door de compiler wanneer er een struct
definitie wordt gelezen. Voor de Complex
struct in het vorige voorbeeld kunt u een exemplaar maken met
let complexPair = Complex(1.4, 2.1);
Exemplaren kunnen ook worden gedefinieerd door de gebruiker met het trefwoord new
, bijvoorbeeld
let complexPair = new Complex { Real = 1.4, Imaginary = 2.1 };
U kunt ook een bestaande struct kopiƫren met de syntaxis van de ...
let copyPair = new Complex { ...complexPair };
Wanneer u kopieert, kunt u afzonderlijke velden opgeven die u wilt wijzigen
let updatedPair = new Complex { ...complexPair, Real = 3.5 };