我对Groovy documentation中使用的术语“闭包”感到有点困惑。根据文档,他们对闭包的定义看起来更像是匿名函数或lambda。
我理解支持第一类函数的语言通常允许形成闭包。但是,这两个概念之间存在差异。
例如,根据Groovy文档:
Groovy中的闭包是匿名的 可能带参数的代码块, 返回一个值,并引用和使用 在其周围声明的变量 范围。
在功能语言的说法中,这样的匿名代码块可能被称为一般的匿名lambda表达式或带有未绑定变量的lambda表达式,或者如果它不包含对未绑定变量的引用(如早期的例子)。 Groovy没有这样的区别。
然后根据关闭时的Wikipedia页面:
术语闭包通常被错误地用于表示匿名函数。
我错过了什么?
答案 0 :(得分:11)
正如它在同一page you linked to in the groovy docs的下一段中所述:
严格来说,关闭不可能 定义。你可以定义一个块 引用局部变量或代码的代码 字段/属性,但它变成了 只有当你“绑定”时才能关闭(给它 一个含义)这段代码 变量。闭包是一种语义 概念,就像一个实例,你 无法定义,只是创建。严格 如果说闭合只是一个闭合 所有自由变量都是绑定的。除非 这种情况只是部分发生 关闭,因此不是真正的关闭。 由于Groovy没有提供方法 定义一个封闭的lambda函数和一个 代码块可能不是关闭的 lambda函数(因为它有 自由变量),我们将两者都称为 封闭 - 即使是句法概念。 我们正在谈论它作为句法 概念,因为定义的代码 并且在那里创建一个实例 没有区别。我们非常清楚 这个术语或多或少 错了,但它简化了许多事情 在谈论语言中的代码时 这不会“知道”差异。