Scala的本地函数:将私有方法转换为本地方法
创始人
2024-04-18 23:00:43
0

上节中processFile方法的建立演示了函数式编程风格的一个重要设计原则:程序应该被解构成若干小的函数,每个完成一个定义良好的任务。单个函数经常很小。这种风格的好处是它给了程序员许多可以灵活组装成更复杂事物的建造模块。每个小块应该充分简化到足以单独理解。

这种方式的一个问题是所有这些帮助函数的名称会污染程序的命名空间。在解释器里这不太成问题,但是一旦函数被打包成可复用的类和对象,就最好对类的客户隐藏帮助函数。它们经常不能独立表达什么意思,并且如果之后用其它方式重写类的话,也常会想保持能删掉帮助方法的足够的灵活度。

Java里,达成这个目的的主要工具是private方法。这种私有方法的方式在Scala里同样有效,如代码8.1里描述的,但是Scala提供了另一种方式:你可以把函数定义在另一个函数中。就好象本地变量那样,这种本地函数仅在包含它的代码块中可见。以下是一个例子:

  1. def processFile(filename: String, width: Int) {  
  2.  def processLine(filename:String, width:Int, line:String) {  
  3.   if (line.length > width) print(filename+": "+line)  
  4.  }  
  5.  val source = Source.fromFile(filename)  
  6.  for (line < - source.getLines) {  
  7.   processLine(filename, width, line)  
  8.  }  
  9. }  
在这个例子中,我们通过把私有方法,processLine,转换为本地方法,processFile,重构了展示在代码8.1中原本的LongLines版本。为了做到这点我们去掉了private修饰符,它仅能应用于方法(并且仅被方法需要),然后把processLine的定义放在processFile的定义里。作为本地函数,processLine的范围局限于processFile之内,外部无法访问。

既然processLine被定义在processFile里,另一个改善变为可能了。请注意filename和width是怎样不改变地传入到帮助函数中。这不是必须的,因为本地函数可以访问包含它们的函数的参数。你可以直接使用外部processLine函数的参数,如代码8.2所示:

  1. import scala.io.Source  
  2. object LongLines {  
  3.  def processFile(filename: String, width: Int) {  
  4.   def processLine(line: String) {  
  5.    if (line.length > width)  
  6.     print(filename +": "+ line)  
  7.   }  
  8.   val source = Source.fromFile(filename)  
  9.   for (line < - source.getLines)  
  10.    processLine(line)  
  11.  }  
  12. }  
代码 8.2 带本地processLine方法的LongLines

更简单了,不是吗?这种对外层函数的参数的使用是Scala提供的通用嵌套的很平常也很有用的例子。7.7节描述的嵌套和作用域应用于所有的Scala架构,包括函数。这是一个简单的原则,不过非常强大,尤其在拥有函数作为第一类值的语言中。

【相关阅读】

  1. Scala中定义函数的方法:method
  2. 继续领悟函数式:Scala指令式风格代码的重构
  3. 学习Scala的变量范围
  4. Scala:match表达式、break和continue
  5. 学习Scala:使用try-catch表达式处理异常

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...