2015-06-08 2 views
9

Я пытаюсь понять закрытие, но буквально каждый определение замыкания, которое я могу найти, использует ту же загадочную и неопределенную фразу: «закрывается над».Что значит «закрыть» что-то?

Что такое закрытие? «О, это функция, которая закрывает над другую функцию.»

Но нигде не могу найти определение того, что «закрывает над» средствами. Может кто-нибудь объяснить, что значит для Thing A «закрыть» Thing B?

+0

http://en.wikipedia.org/wiki/Closure_%28computer_programming%29#History_and_etymology - дает вам кое-что для начала. Закрытие «закрывает» открытые привязки. – Blorgbeard

+0

LOL, * * Закрытие - это что-то, что закрывается над открытыми связями. * «Может ли это быть менее описательным?!? В самом деле?!? ** Действительно?!?! ** – smeeb

+0

У вас будет точка, если бы это была прямая цитата из всего, что я сказал или связал.Вот что я связал с: «лямбда-выражение, открытые привязки (свободные переменные) были закрыты (или связаны) лексической средой, что привело к закрытому выражению или закрытию». – 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 содержит две свободные переменные: a и b. Если вы не знакомы с термином «свободная переменная», это переменная, которая не определена в рамках функции. В этом контексте, до закрыть над что-то, значит удалить любые вхождения свободной переменной из функции. Приведенный выше пример обеспечивает хорошую мотивацию для закрытия. Когда возвращается функция f, мы должны помнить, что значения для a и b предназначены для последующего использования. Как это компилируется, чтобы рассматривать функцию 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 больше не имеет вхождений переменной, которая не определена в ее области. Обычно мы называем термин, который не имеет никаких свободных переменных, поскольку закрыт. Если вы до сих пор неясно, Могущество Matt имеет превосходную глубину объяснение преобразования закрытия в http://matt.might.net/articles/closure-conversion/

+0

Не должно быть: _ Функция 'g' содержит две свободные переменные:' a' и 'b'._? Вы сказали сразу после этого, что свободная переменная является той, которая не определена в сфере видимости? – Sehnsucht

+0

Да, извините, это была опечатка. Благодаря! – Matt

2

От apple documentation

Затворы представляют собой автономные блоки функциональных возможностей, которые могут быть переданы вокруг и используются в коде , Закрытия в Swift аналогичны блокам в C и Objective-C и для лямбда на других языках программирования.

Но что это значит?

Это означает, что замыкание захватывает переменные и константы контекста, в котором он определен, упоминается как закрытия над эти переменные и константы.

Я надеюсь, что это поможет!