鍍金池/ 教程/ Scala/ 函數(shù)–局部函數(shù)
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動態(tài)綁定
Trait 的基本概念
if 表達式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實現(xiàn)方法
try 表達式處理異常
選擇瘦接口還是胖接口設(shè)計?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實現(xiàn)可疊加的修改操作

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

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

這樣帶來的一個問題是,這些小的輔助函數(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ù)的用法。