有些語言中沒有 closure 和普通函數的區分,但 Rust 有。對 Rust 來說普通函數就是一段代碼。而 closure 和 C++ 類似:每個 closure 會創建一個匿名的struct
,編譯器會在當前上下文捕獲 closure 代碼中的外部變數然後塞進這個結構體裡面。
因為 closure 很好用,但是我們不想付出運行時代價。所有語言都有類似的東西,但是它們把 closure 捕獲的結構丟到堆上以保證所有 closure 類型大小一樣,且藉助了 GC 管理資源。
Rust選擇「零額外開銷」(Zero Overhead)所以必須用這種方式來實現 closure。使用高級抽象的同時保持了性能無損。比如說我們能用很函數式的方法處理迭代器,但最後生成的彙編和手寫循環沒什麼區別。