// In one line:
return (a != 1) && ((b-a-p == 0) || (b-a-p > 1))
// Expanded for the compiler:
if(a == 1)
return false;
int bap = b - a - p;
return (bap == 0) || (bap > 1);
при регистрации процессора Вы используете, я могу оптимизировать для блока. =]
Да, замыкание - это не что иное, как функция, которая «сохраняет» некоторые переменные из среды, в которой она определена. Таким образом, в обоих ваших примерах определенное действие сохраняет список с именем subFolders
, на который могут ссылаться функции даже после того, как локальная переменная выходит за пределы области видимости. Переменная фильтра
во втором примере также сохраняется определенной функцией.
Более точное определение здесь
Во втором примере используется замыканий (технически можно сказать, что компилятор вычисляет замыкание в обоих случаях, но вы не используете его в первом случае).
Замыкание - это просто «все переменные, видимые этой функции». Ни больше ни меньше. И очевидно, что в обоих случаях эти переменные существуют, и определяются компилятором.
Но когда мы говорим об "использовании замыканий", мы обычно имеем в виду, что лямбда-выражения могут использовать все локальные переменные, видимые в том месте, где они объявлены. Все они являются частью его закрытия.
В вашем случае d
- это просто параметр лямбда-функции, и, поскольку это все, что вы используете в первом случае, вы на самом деле не пользуетесь замыканий.
Во втором случае фильтр
не определен в лямбда-выражении, это не параметр или что-то еще. Это локальная переменная, которая оказывается видимой в том месте, где объявлена лямбда. Таким образом, это часть замыкания лямбды, что позволяет вам ссылаться на него в теле лямбды.
Править
Как указано в комментариях, я не сделал этого. не читайте ваш код слишком внимательно. Я заметил только второе лямбда-выражение в каждом примере. Первая лямбда-выражение действительно использует замыкания (в обоих случаях она закрывает вложенных папок
).
В обоих примерах есть замыкания. В "A" анонимный метод захватывает вложенные папки локальных переменных. В "B" анонимный метод захватывает локальные переменные subFolders и filter. Также посмотрите здесь .
PS Также обратите внимание, что вы фактически используете закрытие в «A», потому что вы используете переменную subFolders.