W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
上個例子中 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ù)的用法。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: