首页 > 代码库 > 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 处理记录