scala 新的控制结构,函数调用结构的变化
2015-09-18 18:25
288 查看
主要是scala中函数的结构变化,主要是介绍函数结构的变化,主要是:Scala的任何方法调用,如果你确实只传入一个参数,就能可选地使用大括号替代小括号包围参数,如果是两个参数,最后一个是函数参数,同样可以通过函数的curry化实现
任何时候你发现你的代码中多个地方有重复的控制模式,你就应该考虑把它实现为一个新的控制结构。本章早些时候你看到了filesMatching,一个极度特化了的控制模式。现在考虑一个更宽泛使用的代码模式:打开一个资源,对它进行操作,然后关闭资源。你可以使用如下的方法将其捕获并放入控制抽象
示例:
根据withPrintWriter的定义,我们就可以这样调用该方法:
使用这个方法的好处是,由withPrintWriter而不是用户的代码,确认文件在结尾被关闭,这样忘记关闭文件是不可能的。这个技巧被称为贷出模式:loan pattern,因为控制抽象函数,如withPrintWriter,打开了资源并“贷出”给函数。例如,前面例子里的withPrintWriter把PrintWriter借给函数op,当函数完成的时候,它发出信号说明它不再需要“借”的资源PrintWriter,于是资源被关闭在finally块中,以确信其确实被关闭,而忽略函数是正常结束返回还是抛出了异常,这样就可以做到流的关闭。
为了让客户代码看上去更像内建控制结构的一种方式是使用大括号代替小括号包围参数列表。Scala的任何方法调用,如果你确实只传入一个参数,就能可选地使用大括号替代小括号包围参数
示例:
两者的效果都是可以的,注意这是一个参数,所以可以使用{}代替(),如果是两个参数,这就会破坏原则。
在传入一个参数时可以用大括号替代小括号的机制的目的是让客户程序员能写出包围在大括号内的函数文本。这可以让方法调用感觉更像控制抽象。
上述的withPrintWriter方法有两个参数,所以就不能使用{}代替(),但是因为最后一个参数是函数参数,写成这种形式比较好看,因此可以使用curry化,实现这个效果,示例:
把参数分开写,这样就可以根据curry化函数的特性,可以把参数分成不同的函数,调用方法如下:
其中withPrintWriter(file)是一个新的函数,而该新函数只有一个参数,这样就可以把withPrintWriterNew的第二个参数,看作新函数的唯一参数,使用{}代替()。
本文章内容主要参考:scala:如何编写新的控制结构http://developer.51cto.com/art/200907/138447.htm
任何时候你发现你的代码中多个地方有重复的控制模式,你就应该考虑把它实现为一个新的控制结构。本章早些时候你看到了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
相关文章推荐
- failed to install sourceTree in win7
- 五子棋程序的一种实现
- ubuntu安装opencv
- HBase with MapReduce (MultiTable Read)
- sublime text3 配置
- Admin.Admin/Login --- 后台项目中的管理员及登录模块
- Javascript模块化编程(一):模块的写法
- HTTP 请求头中的 X-Forwarded-For
- Tomcat一闪而过 性能调优
- MySQL中将.frm,.myd,.myi文件导入数据库
- HTTP 请求头中的 X-Forwarded-For
- HBase with MapReduce (SummaryToFile)
- 【Android】课程表布局实现(支持动态添加课程)
- wampserver2.5-apache2.4.9允许外部访问的配置
- Dubbo使用
- 机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型
- 【linux学习笔记一】目录处理命令
- docker数据卷和主机共享文件
- Cocos2dx打安卓包遍历所有的.cpp文件
- Ubuntu git使用(一)git服务器的配置