2015-06-08 38 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。

但这是什么意思?

这意味着封闭捕获的变量和在其所定义的上下文的常数,被称为闭过那些变量和常量。

我希望有帮助!