关闭的Groovy概念

时间:2011-03-16 14:15:14

标签: groovy closures

我对Groovy documentation中使用的术语“闭包”感到有点困惑。根据文档,他们对闭包的定义看起来更像是匿名函数或lambda。

我理解支持第一类函数的语言通常允许形成闭包。但是,这两个概念之间存在差异。

例如,根据Groovy文档:

  

Groovy中的闭包是匿名的   可能带参数的代码块,   返回一个值,并引用和使用   在其周围声明的变量   范围。

     

在功能语言的说法中,这样的匿名代码块可能被称为一般的匿名lambda表达式或带有未绑定变量的lambda表达式,或者如果它不包含对未绑定变量的引用(如早期的例子)。 Groovy没有这样的区别。

然后根据关闭时的Wikipedia页面:

  

术语闭包通常被错误地用于表示匿名函数。

我错过了什么?

1 个答案:

答案 0 :(得分:11)

正如它在同一page you linked to in the groovy docs的下一段中所述:

  

严格来说,关闭不可能   定义。你可以定义一个块   引用局部变量或代码的代码   字段/属性,但它变成了   只有当你“绑定”时才能关闭(给它   一个含义)这段代码   变量。闭包是一种语义   概念,就像一个实例,你   无法定义,只是创建。严格   如果说闭合只是一个闭合   所有自由变量都是绑定的。除非   这种情况只是部分发生   关闭,因此不是真正的关闭。   由于Groovy没有提供方法   定义一个封闭的lambda函数和一个   代码块可能不是关闭的   lambda函数(因为它有   自由变量),我们将两者都称为   封闭 - 即使是句法概念。   我们正在谈论它作为句法   概念,因为定义的代码   并且在那里创建一个实例   没有区别。我们非常清楚   这个术语或多或少   错了,但它简化了许多事情   在谈论语言中的代码时   这不会“知道”差异。