Что является настолько особенным о закрытиях?

Пакет Npm (и команда cli) s3-cli может синхронизировать локальную папку и корзину S3 в обе стороны.

s3-cli sync [--delete-removed] /path/to/folder/ s3://bucket/key/on/s3/
s3-cli sync [--delete-removed] s3://bucket/key/on/s3/ /path/to/folder/

12
задан Edward Tanguay 17 April 2009 в 12:04
поделиться

2 ответа

Ваш пример не ясен, и (IMO) не показывает типичное использование захвата (единственное, что захватывается, это a , который всегда равен 3, поэтому не очень интересен).

Рассмотрим этот пример из учебника (предикат):

List<Person> people = ...
string nameToFind = ...
Person found = people.Find(person => person.Name == nameToFind);

Теперь попробуйте это без замыкания; вам нужно проделать гораздо больше работы, даже если мы ленивы:

PersonFinder finder = new PersonFinder();
finder.nameToFind = ...
Person found = people.Find(finder.IsMatch);
...
class PersonFinder {
    public string nameToFind; // a public field to mirror the C# capture
    public bool IsMatch(Person person) {
        return person.Name == nameToFind;
    }
}

Подход захвата распространяется дальше на множество переменных в разных областях - много много сложности, которая скрыта.

Кроме имена, приведенные выше, являются приблизительными значениями того, что компилятор C # делает за кулисами. Обратите внимание, что когда задействованы дополнительные области, мы начинаем связывать различные классы захвата (т.е. внутренние области имеют ссылку на класс захвата внешних областей). Довольно сложный.

У Джона Скита есть хорошая статья по этому вопросу здесь , и больше в его книге .

20
ответ дан 2 December 2019 в 18:22
поделиться

Закрытие является функциональностью компилятора. Вы этого не видите, это просто заставляет код, который вы пишете, работать.

Без него вызов AddToIt (3) не будет выполнен, потому что базовая лямда использует локальную переменную a = 27 в области действия AddToItClusure (). , Эта переменная не существует, когда вызывается AddToIt.

Но из-за Closure, механизма, используемого компилятором, код работает, и вам не нужно об этом заботиться.

0
ответ дан 2 December 2019 в 18:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: