Groovy концепция закрытия - PullRequest
9 голосов
/ 16 марта 2011

Я немного сбит с толку относительно термина "замыкание", используемого в документации Groovy .Согласно документации, их определение замыкания больше похоже на анонимную функцию или лямбду.

Я понимаю, что языки, которые поддерживают функции первого класса, обычно позволяют формировать замыкания.Однако между этими двумя понятиями есть различие.

Например, согласно документации Groovy:

Закрытие в Groovy - это анонимный кусок кода, который может принимать аргументы,возвращать значение, а также ссылаться и использовать переменные, объявленные в окружающей его области.

На языке функционального языка такой блок анонимного кода может называться анонимным лямбда-выражением вообще или лямбда-выражением с несвязанными переменнымизакрытое лямбда-выражение, если оно не содержит ссылок на несвязанные переменные (как порог в предыдущем примере).Groovy не делает таких различий.

Тогда, согласно странице Wikipedia о замыканиях:

Термин замыкание часто ошибочно используется для обозначения анонимной функции..

Чего мне не хватает?

1 Ответ

12 голосов
/ 16 марта 2011

Как сказано в следующем абзаце той же страницы, на которую вы ссылались в отличных документах :

Строго говоря, закрытие не может быть определены. Вы можете определить блок код, который ссылается на локальные переменные или поля / свойства, но он становится закрытие только тогда, когда вы «связываете» (дайте смысл) этот блок кода для переменные. Закрытие является семантическим концепция, как экземпляр, который вы не может определить, просто создать. Строго говорил закрытие только закрытие, если все свободные переменные связаны. Если не это происходит только частично закрыт, следовательно, не совсем закрытие. Так как Groovy не предоставляет способ определить замкнутую лямбда-функцию и блок кода не может быть закрытым лямбда-функция вообще (потому что она имеет свободные переменные), мы называем оба как закрытие - даже в качестве синтаксической концепции. Мы говорим об этом как о синтаксическом концепция, потому что код определения и создание экземпляра один, там нет разницы Мы очень хорошо знаем что эта терминология более или менее неправильно, но это упрощает многие вещи когда речь идет о коде на языке это не «знает» разницу.

...