拥有第一类函数的语言中,即使语言的语法是固定的,你也可以有效地制作新的控制结构。所有你需 要做的就是创建带函数做参数的方法。例如,下面是“双倍”控制结构,能够重复一个操作 两次并返回结果:
scala> def twice(op: Double => Double, x: Double) = op(op(x))twice: ((Double) => Double,Double)Doublescala> twice(_ + 1, 5)res9: Double = 7.0
这个例子里op的类型是Double => Double,就是说 它是带一个Double做参数并返回另一个Double的函数。
任何时候你发现你的代码中多个地方有重 复的控制模式,你就应该考虑把它实现为一个新的控制结构。本章早些时候你看到了filesMatching,一 个极度特化了的控制模式。现在考虑一个更宽泛使用的代码模式:打开一个资源,对它进行操作,然后 关闭资源。你可以使用如下的方法将其捕获并放入控制抽象:
def withPrintWriter(file: File, op: PrintWriter => Unit) { val writer = new PrintWriter(file) try { op(writer) } finally { writer.close() }}
有了这个方法,你就可以这样使用:
withPrintWriter( new File ("date.txt"), writer => writer.println(new java.util.Date))
使用这个方法的好处是,由withPrintWriter而不是用户的代码,确认文件在结尾被关 闭。因此忘记关闭文件是不可能的。这个技巧被称为贷出模式:loan pattern,因为控制抽象函数,如 withPrintWriter,打开了资源并“贷出”给函数。例如,前面例子里的withPrintWriter把 PrintWriter借给函数op。当函数完成的时候,它发出信号说明它不再需要“借”的资源。于 是资源被关闭在finally块中,以确信其确实被关闭,而忽略函数是正常结束返回还是抛出了异常。
让客户代码看上去更像内建控制结构的一种方式是使用大括号代替小括号包围参数列表。Scala 的任何方法调用,如果你确实只传入一个参数,就能可选地使用大括号替代小括号包围参数。例如,代 之以:
scala> println("Hello, world!")Hello, world!
你可以写成:
scala> println { "Hello, world!" }Hello, world!
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 参数
, double
, 控制
, 括号
一个
,以便于您获取更多的相关知识。