F Sharp语言之 Record
1、Record的定义我们使用type 关键字来定义Record,如我们定凶及淄靥义一个名为myRecord的Record: type myRecord = 撑俯擂摔{ Name : string ; Age : int }在定义这个Record 之后,可以将myRecord当作一个模板,然后照此模板实例化自己的Record.如:let record1 = { Name = "H";Age = 20 }let record2 = { Name = "J";Age = 21 }let record3 = { Name = "K";Age = 24 }这三个Record均是由模板myRecord实例化而来的,其Interactive运行结果如下:val record1 : myRecord = {Name ="H"; Age = 20;}val record2 : myRecord = {Name ="J"; Age = 21;}val record3 : myRecord = {Name ="K"; Age = 24;}
2、Record的相关操作——获取元素值获取Record中元素的值很方便,由于每个元素都如同属性一样,我们可以通过使用Record名字加上.再加元素名即可获取其值,如:record1.Name就可以得到值“H”。
3、Record的相关操作——复制有时候我们需要复制一个已知的Record 实例,然后在源Record基础上做小小的改动即可,其实现方法如下:let copyRecord1 = { record1 with Name ="X" }这里我们复制了record1,然后仅改动Name的值,其Interactive运行结果如下:val copyRecord1 : myRecord = {Name= "X"; Age = 20;}
4、Record的相关操作——为Record添加属性或方法Record和F拭貉强跳# 的枚举一样,我们可以为之添加属性和方法,其方法如下:type advanceRecord = 撑俯擂摔{ Name :string; Age : int } member this.Property = "Hi" member this.PrintfInfo() = printfn "%s is%d years old" this.Namethis.Age这里我们定义了一个名为Property的属性,以及一个名为PrintfInfo的方法, 其Interactive 的运行结果为:type advanceRecord1 ={Name: string; Age: int;}with member PrintfInfo : unit -> unit member Property : stringend使用定义了属性与方法的Record与没有方法与属性的Record没有什么区别。其使用方法和获取元素值的方法一样,如:let advrcd = { Name = "Z";Age = 24}advrcd.PrintfInfo()其运行结果:Z is 24 years old
5、Record的相关操作——模式匹配Record可以做为模式匹配的一部分,这也是Record相比传统数据类型的一项优势,在interactive 中运行下面代码:type myRecord = { Name : string ; Age : int }let record1 = { Name = "H";Age = 20 }let record2 = { Name = "J";Age = 21 }let record3 = { Name = "K";Age = 24 }let recordList = [ record1; record2; record3 ]let result = recordList |> List.filter ( function | {Age = 20} -> true | _ -> false )其运行结果为:val it : myRecord list = [{Name ="H"; Age = 20;}]
6、Record相对于传统面向对象数据结果的优势Record中的元素默认情况下是不可变的,相比类而言更安全Record不能被继承,进一步提高了其安全性Record可以被用来做模式匹配Record可以进行比较,可以使用等号