簡單理解 Scala 的閉包
閉包這個詞大家都不陌生,尤其是做spark的同學,經常會看到,但是很多人還是對閉包比較懵懂,就像前面說的watermark一樣,大家都很熟悉朗朗上口,但是又貌似一頭霧水沒有理解。
那麼,浪尖今天就說說閉包~
首先給出浪尖理解的定義吧:
「函式」和「函式內部能訪問到的變數」(也叫環境)的總和,就是一個閉包。
按照這個定義呢?下面就應該是一個閉包:
var factor = 3 val adder = (i:Int) => i * factor
可能會有同學有疑問:浪尖,這不對啊? 我看網上說的閉包構造是:
閉包首先有函式巢狀,內部函式引用外部函式的變數,然後返回的是一個函式。
應該是這個樣子的:
object closure { def main(args: Array[String]): Unit = { println(makeAdd()(1)) } def makeAdd() = { val more = 10 (x: Int) => x + more } }
為啥要用函式巢狀?
需要外部函式的作用主要是隱藏變數,限制變數作用的範圍。
有些人看到「閉包」這個名字,就一定覺得要用什麼包起來才行。其實這是翻譯問題,閉包的原文是 Closure,跟「包」沒有任何關係。
所以函式套函式只是為了造出一個區域性變數,跟閉包無關。
為啥要return函式呢?
很明顯,不return函式無法使用閉包~~
那麼現在換個腦子吧,我們將more 變成makeAdd的引數,那麼就是下面的形式:
def makeAdd(more : Int) = (x: Int) => x + more
請問這種結構看著眼熟麼? 歡迎留言~
490+球友~