2015-04-15 14 views
6

Mi sento davvero stupido riguardo a questo, ma mi sto trovando in difficoltà a trovare documentazione su questo.Come posso creare una nuova istanza di una struttura in F #?

Se dichiaro una struct in questo modo:

type BuildNumber = 
    struct 
     val major : int 
     val minor : int 
     val build : int 
     val revision : int 
    end 

E allora come faccio a fare una nuova istanza del tipo BuildNumber?

+3

Si noti che le strutture sono raramente una buona idea in F #, con un record non è preferibile. – scrwtp

+0

Grazie per il suggerimento! Cosa rende un disco migliore? –

+4

Le strutture sono utili per la stessa identica cosa in F # così come sono in C# - mantenendo i dati nello stack per il crunch del numero in base al tempo. Tuttavia, alcuni utili idiomi e strutture dati F # possono causare la chiusura accidentale dei dati nell'heap e questo tipo di ottimizzazione a basso livello è meno comune in un linguaggio funzionale di alto livello come F #. Inoltre, i record F # sono più piacevoli con cui lavorare, se non si utilizza una struttura per motivi di prestazioni. –

risposta

3

Si utilizza la parola chiave new e si definisce un costruttore.

Ad esempio:

type simple = 
    struct 
     val A : int 
     val B : int 
     new (a: int, b: int) = { A = a; B = b; } 
    end 

let s = new simple(1, 2) 
+0

Se non c'è alcun 'nuovo' nella definizione, è impossibile creare un'istanza del tipo? Se è così, è inutile? –

+1

@EricDand Puoi ancora fare 'new simple()' e funzionerà bene. Ma tutti i campi saranno il valore predefinito per il tipo (zero in questo caso) e immutabili. Quindi non al 100% inutile, ma piuttosto vicino. –

+4

Ciò che è importante notare se si sta progettando un tipo di struct è che le struct possono sempre essere inizializzate a zero (cioè create con "costruttore senza parametri"), diversamente dai tipi di ref che sono nulli o devono passare attraverso un vero costruttore dichiarato. Quindi, se aggiungi metodi alla struct, assicurati di gestire sempre il caso in cui tutti i campi sono predefiniti (questa gestione potrebbe essere semplice come lanciare un'eccezione op non valida). – latkin

Problemi correlati