2015-06-08 45 views
9

我想了解封閉,但字面上封閉的定義,我可以找到使用相同的含糊不清的短語:「關閉」。這是什麼意思「關閉」的東西?

什麼是關閉? 「哦,這是一個函數,關閉了其他功能。

但無處我能找到的東西「關閉了」的意思的定義。有人能解釋什麼事情是什麼意思讓事情A「關閉」事情B?

+0

http://en.wikipedia.org/wiki/Closure_%28computer_programming%29#History_and_etymology - 給你一些開始。關閉「關閉」打開的綁定。 – Blorgbeard

+0

LOL,「*封閉是通過打開的綁定關閉的東西。*」這可能會更不具描述性?!?真?!? **真的嗎?!?!** – smeeb

+0

如果那是我所說或所鏈接的任何內容的直接引用,那麼你會有一個觀點。下面是我鏈接到的內容:「一個lambda表達式,其開放綁定(自由變量)已被詞法環境關閉(或綁定),導致了一個關閉的表達式或閉包」。 – Blorgbeard

回答

5

閉包是由一個代碼指針和一個環境指針組成的一對。環境指針包含給定函數的所有自由變量。例如:

fun f(a, b) = 
    let fun g(c, d) = a + b + c + d 
    in g end 

val g = f(1, 2) 
val result = g(3, 4) (*should be 10*) 

功能g包含兩個自由變量:ab。如果您對「自由變量」這個術語不熟悉,則它是一個未在函數範圍內定義的變量。在這種情況下,關閉東西,意味着從函數中刪除任何發生的自由變量。上面的例子爲閉包提供了很好的動力。當函數f返回時,我們需要能夠記住以後的ab的值。這是編譯的方法,是治療功能g作爲代碼指針,包含了所有的自由變量,如記錄:

fun g(c, d, env) = env.a + env.b + c + d 
fun f(a, b, env) = (g, {a = a, b = b}) 
val (g, gEnv) = f(1, 2) 
val result = g(3, 4, gEnv) 

當我們應用功能g,我們提供調用時所返回的環境功能f。請注意,現在函數g不再有任何未在其範圍內定義的變量。我們通常稱一個沒有任何自由變量的術語,如已關閉。如果你還不清楚,馬特強權在閉合轉換的深度解釋一個優秀的http://matt.might.net/articles/closure-conversion/

+0

不應該是:_g函數包含兩個自由變量:'a'和'b'._?你剛纔說過一個自由變量是__wasn't__在範圍中定義的變量嗎? – Sehnsucht

+0

是的,抱歉,這是一個錯字。謝謝! – Matt

2

apple documentation

閉包是可以通過周圍 並在代碼中使用的功能自足塊。 Swift中的閉包類似於C和Objective-C中的 以及其他編程語言中的lambda。

但這是什麼意思?

這意味着封閉捕獲的變量和在其所定義的上下文的常數,被稱爲閉過那些變量和常量。

我希望有幫助!