4.4.2.2 绘制饼图部分
清单 4.8 实现的函数 drawPieSegment,用随机颜色,填充图表指定部分。这个函数在后面的应用程序中,被执行绘图的函数在两个阶段调用;处理函数绘制每一部分都将调用它,并将获得作为参数值所需的所有信息。
清单 4.8 绘制饼图的一个部分 (F#)
let drawPieSegment(gr:Graphics, title,startAngle, occupiedAngle) =
letbr = randomBrush()
gr.FillPie
(br,170, 70, 260, 260, <-- 指定饼图的中点和大小
startAngle,occupiedAngle)
br.Dispose()
函数的参数写成一个大的元组,有四个要素,增加了代码的可读性;函数的第一个参数,有类型批注,指定类型为 Graphics,它是一个 System.Drawing 类,提供了绘图功能,我们在函数中使用它的 FillPie 的方法,但这就是编译器有关gr 值所能知道的全部信息,因此,无法推断出类型,这就是我们需要类型批注的原因;元组中接下来的三个元素分别是标题文本(在代码中不使用,但对绘制标签很重要),饼图部分的起始角和这部分的角度(以度为单位)。注意,绘制一旦完成,就要释放笔刷,F# 中有一种更好的做法,我们将在第九章讨论。
选择写函数的语法
已经目前为止,我们已经用了有两种方法,来写有多个参数的函数:函数的参数既可以写成在括号中、以逗号分隔的列表,也可以写成以空格分隔的值列表。注意,第一种风格无论如何不是很特别的:
let add(a, b) = a + b
这个函数的参数为元组,表达式 (a, b) 是常规模式(usual pattern),在第三章我们用它来分解元组。问题是哪种方法更好。不幸的是,没有一个权威的答案,全凭个人喜好。唯一重要的是保持一致。
在本书,我们通常把函数的参数写成元组,尤其是写一些更复杂的使用 .NET 库的工具函数,这能保持代码的语法与调用 .NET 方法时所使用的一致。在写简单的工具函数,且主要是处理 F# 值时,我们会使用空格。
当调用或声明的函数只有一个参数时,我们也写上括号,例如, sin(x),虽然括号是可选的,也可以写成 sin x。这一决定既符合函数通常的数学式,也符合调用有多个参数的 .NET 方法。我们会在第五和第六章,再回到这个主题,届时,将更详细地讨论函数;此外,还将讨论实现和使用高阶函数。
前面的清单中的 drawPieSegment 函数是两个绘图函数中的一个,它将作为函数 drawStep 的参数值,将迭代并绘制饼图的所有部分。在看 drawStep 的代码之前,我们要先看一下它的类型。虽然,在代码中我们不需要写出类型,但是,了解代码中所使用值的类型还是有用的。