閉包
閉包是什麼?先來看看維基百科上的描述:
在計算機科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函數閉包(function closures),是 引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。閉包在運行時可以有多個實例,不同的引用環境和相同的函數組合可以產生不同的實例。
閉包的概念出現於60年代,最早實現閉包的程序語言是Scheme。之後,閉包被廣泛使用於函數式編程語言如ML語言和LISP。很多命令式程序語言也開始支持閉包。
可以看到,第一句就已經說明了什麼是閉包:閉包是引用了自由變量的函數。所以,閉包是一種特殊的函數。
在rust中,函數和閉包都是實現了Fn
、FnMut
或FnOnce
特質(trait)的類型。任何實現了這三種特質其中一種的類型的對象,都是 可調用對象 ,都能像函數和閉包一樣通過這樣name()
的形式調用,()
在rust中是一個操作符,操作符在rust中是可以重載的。rust的操作符重載是通過實現相應的trait
來實現,而()
操作符的相應trait
就是Fn
、FnMut
和FnOnce
,所以,任何實現了這三個trait
中的一種的類型,其實就是重載了()
操作符。關於Fn
、FnMut
和FnOnce
的說明請看第二節閉包的實現。
本章主要分四節講述: