我正在尝试理解闭包,但字面意思我可以找到的闭包的每个定义使用相同的神秘和模糊的短语:“关闭”。< / p>
什么是关闭? “哦,这是关闭另一个功能的功能。”
但我无处可寻找“结束”的含义。有人能解释为什么东西A要“关闭”东西B?
答案 0 :(得分:6)
闭包是由代码指针和环境指针组成的对。环境指针包含给定函数的所有自由变量。例如:
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 Might在http://matt.might.net/articles/closure-conversion/
答案 1 :(得分:2)
闭包是可以传递的自包含功能块 在您的代码中使用。 Swift中的闭包类似于块 在C和Objective-C以及其他编程语言中的lambda。
但这意味着什么?
这意味着闭包捕获定义它的上下文的变量和常量,称为关闭那些变量和常量。
我希望有所帮助!