在scala中柴梆,你可以在任何作用域內(nèi)定義函數(shù),包终惑,類绍在,甚至是另外一個(gè)函數(shù)或者方法。在函數(shù)體內(nèi)雹有,你可以訪問到相應(yīng)作用域內(nèi)的任何變量偿渡,這樣聽上去是不是很抽象,那么廢話不多說霸奕,直接上案例:
首先我們來回顧下如何定義函數(shù)溜宽,因?yàn)閟cala的核心就是函數(shù)。
定義函數(shù):
val fun2: (Double) => Double = 3 * _ 定義了一個(gè)函數(shù)
定義方法:
def mulby(factor: Double) = (x: Double) => factor * x 該方法返回一個(gè)函數(shù)
我們?cè)賮砑狱c(diǎn)邏輯處理质帅,再來定義一個(gè)方法:
def processLine(line: String) = (fileName: String, width: Int) => {
//調(diào)用該方法返回的是一個(gè)函數(shù)
if (line.length > width) {
println(fileName + ":" + line)
}
}
我們來處理閉包的問題:
Source.fromString("helloworld").getLines().foreach(line => {
// processLine(line) 返回的是一個(gè)函數(shù)
processLine(line)("name", 5) 調(diào)用方法里面的函數(shù)适揉,這就是一個(gè)閉包問題
})
輸出結(jié)果如下:
name:helloworld