首页 > 代码库 > 7.1.1.1 处理记录
7.1.1.1 处理记录
7.1.1.1 处理记录
我们在本章后面还要用到Rect 类型,有两个简单的函数来处理矩形。第一个函数是缩小矩形,通过从每一条边上减去指定的宽度和高度,第二个函数是把我们的矩形表示形式转换成 System.Drawing 命名空间中的 RectangleF 类。清单 7.2 中是这两个函数。
清单 7.2 处理矩形的函数 (F# Interactive)
> open System.Drawing;;
> let deflate(original, wspace, hspace)=
{ Left = original.Left+ wspace | 创建、返回缩小的矩形
Top = original.Top + hspace |
Width = original.Width - (2.0f * wspace) |
Height = original.Height - (2.0f * hspace) };; |
val deflate : Rect * float32 *float32 –> Rect [1]
> let toRectangleF(original) =
RectangleF(original.Left,original.Top, | 返回RectangleF 类的实例
original.Width, original.Height);; |
val toRectangleF : Rect –>RectangleF [2]
> { Left = 0.0f; Top = 0.0f;
Width =100.0f; Height = 100.0f; };;
val it : Rectangle = (...)
> deflate(it, 20.0f, 10.0f);; [3]
val it : Rectangle = { Left = 20.0f; Top =10.0f;
Width = 60.0f; Height = 80.0f;}
从类型签名[1][2]可以发现,F# 编译器正确推断参数 original 的类型是 Rect。在函数体中,编译器使用字段名进行访问,如果我们有两个记录类型,并且有些字段名是相同的,那么,就必须显式指定其类型。我们可以使用类型批注,在函数声明中写上 (original:Rect)。通常,当使用 F# Interactive 时,可以立即测试函数[3]。当创建值时,我们没有使用let 绑定,而是在后面使用自动创建的 it 值来访问的。
总结一下,F# 的记录是不可变的,可以使用 {x with ...} 构造方便地进行复制。在 C# 中,如果我们像这样设计数据结构,可能要使用类,偶尔会用到结构,但肯定要用特殊的方法。在下一节,我们将介绍如何实现。
7.1.1.1 处理记录