scala 新的控制结构,函数调用结构的变化

主要是scala中函数的结构变化,主要是介绍函数结构的变化,主要是:Scala的任何方法调用,如果你确实只传入一个参数,就能可选地使用大括号替代小括号包围参数,如果是两个参数,最后一个是函数参数,同样可以通过函数的curry化实现

任何时候你发现你的代码中多个地方有重复的控制模式,你就应该考虑把它实现为一个新的控制结构。本章早些时候你看到了filesMatching,一个极度特化了的控制模式。现在考虑一个更宽泛使用的代码模式:打开一个资源,对它进行操作,然后关闭资源。你可以使用如下的方法将其捕获并放入控制抽象
示例:

  def withPrintWriter(file: File, op: PrintWriter => Unit) {
    val writer = new PrintWriter(file)
    try {
      op(writer)
    } finally {
      writer.close()
    }
  }

根据withPrintWriter的定义,我们就可以这样调用该方法:

withPrintWriter(
  new File("date.txt"),
  writer => writer.println("写入")
 )

使用这个方法的好处是,由withPrintWriter而不是用户的代码,确认文件在结尾被关闭,这样忘记关闭文件是不可能的。这个技巧被称为贷出模式:loan pattern,因为控制抽象函数,如withPrintWriter,打开了资源并“贷出”给函数。例如,前面例子里的withPrintWriter把PrintWriter借给函数op,当函数完成的时候,它发出信号说明它不再需要“借”的资源PrintWriter,于是资源被关闭在finally块中,以确信其确实被关闭,而忽略函数是正常结束返回还是抛出了异常,这样就可以做到流的关闭。
为了让客户代码看上去更像内建控制结构的一种方式是使用大括号代替小括号包围参数列表。Scala的任何方法调用,如果你确实只传入一个参数,就能可选地使用大括号替代小括号包围参数
示例:

object test21{
    
    
  def main(args: Array[String]) {
    println("你好!");
    println{
   
   "你好!"};
  }
}

两者的效果都是可以的,注意这是一个参数,所以可以使用{}代替(),如果是两个参数,这就会破坏原则。
在传入一个参数时可以用大括号替代小括号的机制的目的是让客户程序员能写出包围在大括号内的函数文本。这可以让方法调用感觉更像控制抽象。
上述的withPrintWriter方法有两个参数,所以就不能使用{}代替(),但是因为最后一个参数是函数参数,写成这种形式比较好看,因此可以使用curry化,实现这个效果,示例:

def withPrintWriterNew(file: File)(op: PrintWriter => Unit) {
   val writer = new PrintWriter(file)
   try {
     op(writer)
   } finally {
     writer.close()
   }
 }

把参数分开写,这样就可以根据curry化函数的特性,可以把参数分成不同的函数,调用方法如下:

val file = new File("date.txt")  
withPrintWriterNew(file) {  
 writer => writer.println(new java.util.Date)  
} 

其中withPrintWriter(file)是一个新的函数,而该新函数只有一个参数,这样就可以把withPrintWriterNew的第二个参数,看作新函数的唯一参数,使用{}代替()。

本文章内容主要参考:scala:如何编写新的控制结构http://developer.51cto.com/art/200907/138447.htm

猜你喜欢

转载自blog.csdn.net/u010652576/article/details/48550109