Wie bereits erwähnt, können Sie den Typ 'a option
verwenden. Dies erstellt jedoch kein optionales Datensatzfeld (dessen Wert Sie beim Erstellen nicht angeben müssen). Zum Beispiel:
type record =
{ id : int
name : string
flag : bool option }
Um einen Wert des record
Typ zu erstellen, müssen Sie noch den Wert des flag
Feld zur Verfügung zu stellen:
let recd1 = { id = 0; name = "one"; flag = None }
let recd2 = { id = 0; name = "one"; flag = Some(true) }
// You could workaround this by creating a default record
// value and cloning it (but that's not very elegant either):
let defaultRecd = { id = 0; name = ""; flag = None }
let recd1 = { defaultRecd with id = 0; name = "" }
Leider (soweit ich weiß) Sie können‘ t Erstellen Sie einen Datensatz, der ein Optionsfeld enthält, das Sie bei der Erstellung auslassen können. Sie können jedoch einen Klassentyp mit einem Konstruktor verwenden und dann können Sie die ?fld
Syntax verwenden, um optionale Parameter des Konstruktors zu erstellen:
type Record(id : int, name : string, ?flag : bool) =
member x.ID = id
member x.Name = name
member x.Flag = flag
let rcd1 = Record(0, "foo")
let rcd2 = Record(0, "foo", true)
Die Art der rcd1.Flag
bool option
sein wird, und Sie können mit ihm arbeiten Musterabgleich mit (wie von Yin Zhu demonstriert). Der einzige bemerkenswerte Unterschied zwischen Datensätzen und einfachen Klassen wie diesem besteht darin, dass Sie die with
-Syntax nicht für Cloning-Klassen verwenden können und dass Klassen die Strukturvergleichssemantik nicht (automatisch) implementieren.
lass mich = StrangleMyself! Option Ich dachte ernsthaft, dass ich dies heute Nachmittag versuchte. Beschäftigtes Ein- und Ausführen von Besprechungen - Ich denke, ich muss besser Notizen machen und die Spezifikationen lesen. Ich bedanke mich demütig Todd – akaphenom