Scala 函數(shù)–局部函數(shù)

2018-09-28 18:24 更新

函數(shù)–局部函數(shù)

上個例子中 ProcessFile 使用了一個非常重要的設計原則–應用程序可以分解成多個小的函數(shù),每個小的函數(shù)完成一個定義完好的功能。使用這程序設計風格可以使得程序員有相當數(shù)量的程序構造模塊,通過這些小的構造模塊的組合來完成較復雜的功能。每個小的構造模塊一個應該足夠簡潔以幫助理解。

這樣帶來的一個問題是,這些小的輔助函數(shù)的名稱可能會影響到程序空間,你不能在同個程序員使用兩個相同名稱的函數(shù),即使你定義私有函數(shù)。如果你設計函數(shù)庫,你也不希望有些輔助函數(shù)為庫函數(shù)的用戶直接調(diào)用,對于 Java 來說,你可以通過私有成員函數(shù)。而 Scala 除了支持私有成員函數(shù)外,還支持局部函數(shù)(其作用域和局部變量類似)。

也就是說可以在函數(shù)的內(nèi)部再定義函數(shù),如同定義一個局部變量,例如,修改前面的 ProcessFile 的例子如下:

import scala.io.Source
object LongLines {
  def processFile(filename: String, width: Int) {
    def processLine(filename:String,
     width:Int, line:String){
     if(line.length > width)
       println(filename + ":" +line.trim)
   }
    val source= Source.fromFile(filename)
    for (line <- source.getLines())
      processLine(filename,width,line)
   }
}

這個例子不私有成員函數(shù) processLine 移動到 processFile 內(nèi)部,成為一個局部函數(shù),也正因為 processLine 變成了 processFile 的一個局部函數(shù),因此 processLine 可以直接訪問到 processFile 的參數(shù) filename 和 width,因此代碼可以進一步優(yōu)化如下:

import scala.io.Source
object LongLines {
  def processFile(filename: String, width: Int) {
    def processLine(line:String){
     if(line.length > width)
       println(filename + ":" +line.trim)
   }
    val source= Source.fromFile(filename)
    for (line <- source.getLines())
      processLine(line)
   }
}

代碼變得更簡潔,是不是,局部函數(shù)的作用域和局部變量作用域一樣,局部函數(shù)訪問包含該函數(shù)的參數(shù)是非常常見的一種嵌套函數(shù)的用法。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號