2011-03-16 142 views
8

我對Groovy documentation中使用的術語「閉包」有點困惑。根據文檔,它們對閉包的定義更像是一個匿名函數或lambda。Groovy關閉的概念

我知道支持第一類函數的語言通常允許構建閉包。但是,這兩個概念是有區別的。

例如,根據Groovy的文檔:

在Groovy的封閉件是一個匿名 塊的代碼,用於獲取參數, 返回一個值,並且參考和使用在其周圍聲明 變量 範圍。

在函數式語言中,這樣的匿名代碼塊可能被稱爲一般的匿名lambda表達式,或者帶有未綁定變量的lambda表達式,或者如果未包含對未綁定變量的引用(如閾值in前面的例子)。 Groovy沒有這樣的區別。

然後根據Wikipedia頁面上瓶蓋:

術語閉合往往誤用來指匿名函數。

我錯過了什麼?

回答

11

因爲它在同一個page you linked to in the groovy docs的下一段說:

嚴格地說,封閉不能 定義。您可以定義一個 代碼塊,它指的是局部變量或 字段/屬性,但只有當您將此代碼塊「綁定」(將其賦予 的含義)爲 變量時,它纔會變爲 閉包。閉包是一個語義 的概念,就像一個實例,你不能定義,只是創建。嚴格地講, 說的一個閉包只是一個閉包,如果 所有的自由變量都被綁定。除非 發生這種情況,它只是部分 已關閉,因此不是真正的關閉。 由於Groovy中並不 提供一種方式定義了一個封閉的lambda函數和代碼 塊可能不是在所有封閉 lambda函數(因爲它有 自由變量),我們指的既是 關閉 - 甚至作爲句法概念。 我們在說它是句法 的概念,因爲定義 和創建實例的代碼是1,那麼 沒有區別。我們非常清楚 這個術語或多或少是 錯誤,但是它在簡化許多事情 當談論代碼在一個語言 不會「知道」的差異。

+1

也許我在閱讀該段時眼睛一睜。 – Steve 2011-03-16 14:28:44

+0

這可能是最後一句'我們非常清楚這個術語或多或少是錯誤的,但是當用一種不知道「差異」的語言談論代碼時,它簡化了很多事情。 – 2011-03-16 14:30:08

+0

那部分很清楚。然而,之前的東西讓我的大腦在精神上放棄了,並跳過了整個段落。 :) – Steve 2011-03-16 14:34:29