F#7:记录

因此,我们将继续探索更多F#类型。 这次,我们将研究记录的类型。

我如何创建帖子


创建新的F#条目时,它可以使您想起C#中的匿名对象。 这就是创建它们的方式。 我认为它们与C#中的匿名对象非常相似,因此,如果您使用C#,则F#条目应该不会很复杂。

这一切都始于创建一种新的录制类型。 类型定义列出了属性的名称以及属性的类型,如下所示。

如果您有记录类型定义,则可以使用Let将新实例与值关联。 同样,可以在下面看到一个示例,其中我们使用Let绑定来绑定新记录,并且还将记录实例的属性打印到控制台输出中。

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 

图片

如何更改/克隆记录


您可以克隆和修改条目,通常按以下步骤完成:

 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 

图片

请注意,在创建Tom Person的新实例时,我们如何使用with关键字。 这种记录表达形式称为“ 复制和更新记录表达 ”。 您可以使用的另一个选项(再次,我们将在下一篇文章中详细讨论)是在您的帖子类型中使用可变属性。 默认情况下,条目是不可变的。 但是,您也可以显式指定可变字段。

这是一个示例,请注意我如何创建一个具有可变属性MutableName的新类型。 通过定义一个可变字段,可以更新记录的MutableName属性的值,您可以使用“ <-”运算符来完成。 这只允许您分配一个新值。

 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 

图片

记录比较


仅当所有属性都相同时,记录类型才相等。 这是一个例子:

 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 

图片

记录比较模式


当然,您可以使用模式匹配(第二天讨论),这是主要的F#方法,以匹配记录类型。 这是一个例子:

 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 

图片

方法和属性


也可以将其他成员添加到条目中。 在下面的示例中,我们添加了“ Details”属性,以允许我们使用一个属性来获取有关记录的完整信息(与我们可以通过重写ToString()方法实现的功能一样多,但稍后将在OOP方法中进行更多操作)

请注意,如果您尝试将一个项目添加到记录类型定义中(如屏幕截图所示),则会收到一个奇怪的错误

图片

只需将记录属性定义放在新行上,并确保元素也从新行开始并观察该缩进(空格),就很容易解决此问题,因为这在F#中很重要:

 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 

图片

Source: https://habr.com/ru/post/zh-CN470273/


All Articles