F # 7: Aufzeichnungen

Also setzen wir unsere Reise zu weiteren F # -Typen fort. Dieses Mal werden wir uns die Arten von Datensätzen ansehen.

Wie erstelle ich einen Beitrag?


Wenn Sie einen neuen F # -Eintrag erstellen, kann er Sie an anonyme Objekte in C # erinnern. So erstellen Sie sie. Ich denke, sie sind anonymen Objekten in C # sehr ähnlich. Wenn Sie also C # verwendet haben, sollten die F # -Einträge nicht kompliziert sein.

Alles beginnt mit dem Erstellen eines neuen Typs für die Aufnahme. In der Typdefinition sind der Name der Eigenschaften sowie der Typ der Eigenschaften aufgeführt, wie unten dargestellt.

Wenn Sie eine Datensatztypdefinition haben, können Sie mit Let eine neue Instanz einem Wert zuordnen. Ein Beispiel hierfür ist unten zu sehen, wo wir einen neuen Datensatz mithilfe der Let-Bindung binden und die Eigenschaften der Datensatzinstanz in die Konsolenausgabe drucken.

type Person = { Age : int; Sex: string; Name:string; } .... .... .... .... let sam = { Age = 12; Sex="Male"; Name ="Sam" } printfn "let sam = { Age = 12; Sex=\"Male\"; Name=\"Sam\" }" printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.Name 

Bild

Wie kann ich einen Datensatz ändern / klonen?


Sie können den Eintrag klonen und ändern. Dies erfolgt normalerweise wie folgt:

 let sam = { Age = 12; Sex="Male"; Name ="Sam" } let tom = { sam with Name="Tom" } printfn "let tom = { sam with Name=\"Tom\" }" printfn "Person with Age is %i and Sex is %s and Name is %s" tom.Age tom.Sex tom.Name 

Bild

Beachten Sie, wie wir das Schlüsselwort with beim Erstellen einer neuen Instanz von Tom Person verwendet haben. Diese Form des Datensatzausdrucks wird als " Datensatzausdruck kopieren und aktualisieren " bezeichnet. Eine andere Option, die Sie verwenden können (wir werden im nächsten Beitrag noch einmal ausführlicher darauf eingehen), ist die Verwendung einer veränderlichen Eigenschaft in Ihrem Beitragstyp. Einträge sind standardmäßig unveränderlich . Sie können jedoch auch explizit ein veränderbares Feld angeben.

Beachten Sie in diesem Beispiel, wie ich einen neuen Typ mit einer veränderlichen Eigenschaft namens MutableName erstellt habe. Durch das Definieren eines veränderlichen Feldes kann ich den Wert der MutableName-Eigenschaft eines Datensatzes aktualisieren, was Sie mit dem Operator "<-" tun können. Damit können Sie nur einen neuen Wert zuweisen.

 type MutableNamePerson = { Age : int; Sex: string; mutable MutableName:string; } .... .... .... .... //create let sam = { Age = 12; Sex="Male"; MutableName ="Sam" } printfn "let sam = { Age = 12; Sex=\"Male\"; Name=\"Sam\" }" printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.MutableName //update sam.MutableName <- "Name changed" printfn "sam.MutableName <- \"Name changed\"" printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.MutableName 

Bild

Vergleich von Aufzeichnungen


Datensatztypen sind nur dann gleich, wenn ALLE Eigenschaften als gleich angesehen werden. Hier ist ein Beispiel:

 type Person = { Age : int; Sex: string; Name:string; } .... .... .... .... let someFunction p1 p2 = printfn "p1=%A, and p2=%A, are they equal %b" p1 p2 (p1=p2) let sam = { Age = 12; Sex = "Male"; Name = "Sam" } let john = { Age = 12; Sex = "Male"; Name = "John" } let april = { Age = 35; Sex = "Female"; Name = "April" } let sam2 = { Age = 12; Sex = "Male"; Name = "Sam" } do someFunction sam john do someFunction sam april do someFunction sam sam2 

Bild

Vergleichsmuster aufzeichnen


Natürlich können Sie den Mustervergleich (Diskussion am nächsten Tag), die Hauptmethode für F #, verwenden, um Datensatztypen abzugleichen. Hier ist ein Beispiel:

 type Person = { Age : int; Sex: string; Name:string; } ..... ..... ..... ..... let someFunction (somePerson :Person) = match somePerson with | { Name="Sam" } -> printfn "Sam is in the house" | _ -> printfn "you aint Sam, get outta here clown" let sam = { Age = 12; Sex="Male"; Name ="Sam" } let john = { Age = 12; Sex="Male"; Name ="John" } do someFunction sam do someFunction john 

Bild

Methoden und Eigenschaften


Es ist auch möglich, zusätzliche Mitglieder zu den Einträgen hinzuzufügen. Hier ist ein Beispiel, in dem wir die Eigenschaft "Details" hinzufügen, damit wir mithilfe einer Eigenschaft vollständige Informationen über den Datensatz erhalten können (so viel wie wir durch Überschreiben der ToString () -Methode erreichen könnten, aber später mehr zu OOP-Methoden).

Bitte beachten Sie, dass beim Versuch, der Datensatztypdefinition ein Element hinzuzufügen, wie im Screenshot gezeigt, eine seltsame Fehlermeldung angezeigt wird

Bild

Dies lässt sich leicht lösen, indem Sie einfach die Definitionen der Datensatzeigenschaften in eine neue Zeile setzen und sicherstellen, dass das Element auch in einer neuen Zeile beginnt, und diese Einrückung (Leerzeichen) beachten, da dies alles in F # wichtig ist:

 type Person = { Age : int; Sex: string; Name:string; } member this.Details = this.Age.ToString() + " " + this.Sex.ToString() + " " + this.Name .... .... .... .... let sam = { Age = 12; Sex = "Male"; Name = "Sam" } printfn "sam Details=%s" sam.Details 

Bild

Source: https://habr.com/ru/post/de470273/


All Articles