В чем разница между «закрытием» и «лямбдой»?

см. выше:

сначала контейнер будет пытаться index.html, и если он не существует, то он попытается выполнить index.jsp.

В моем приложении всегда используется index.html, когда есть index.jsp, index.html, независимо от конфигурации конфигурации.

756
задан S.L. Barth 20 July 2012 в 17:18
поделиться

3 ответа

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

А закрытие является любой функцией, которая завершения [более чем 1 117] среда , в котором это было определено. Это означает, что может переменные доступа не в его списке параметров. Примеры:

def func(): return h
def anotherfunc(h):
   return func()

Это вызовет ошибку, потому что func не делает близкий [более чем 1 119], среда в anotherfunc - h не определена. func только завершения по глобальной среде. Это будет работать:

def anotherfunc(h):
    def func(): return h
    return func()

, поскольку здесь, func определяется в anotherfunc, и в python 2.3 и больше (или некоторое число как это), когда они [почти 1 122] получили корректные закрытия (мутация все еще не работает), это означает, что завершения [более чем 1 120] anotherfunc среда и может переменные доступа в нем. В Python 3.1 +, мутация работает также при использовании nonlocal ключевое слово .

, Другой важный момент - func продолжит закрывать [более чем 1 112] среду, даже когда это больше не оценивается в [1 113]. Этот код будет также работать:

def anotherfunc(h):
    def func(): return h
    return func

print anotherfunc(10)()

Это распечатает 10.

Это, как Вы замечаете, не имеет никакого отношения лямбда с - им отличающиеся два года (хотя связано) понятия.

665
ответ дан Ben 20 July 2012 в 17:18
поделиться

Когда большинство людей думает функции , они думают именованные функции :

function foo() { return "This string is returned from the 'foo' function"; }

Они позваны по имени, конечно:

foo(); //returns the string above

С [1 110] лямбда-выражения , Вы можете иметь анонимные функции :

 @foo = lambda() {return "This is returned from a function without a name";}

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

foo();

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

function filter(list, predicate) 
 { @filteredList = [];
   for-each (@x in list) if (predicate(x)) filteredList.add(x);
   return filteredList;
 }

//filter for even numbers
filter([0,1,2,3,4,5,6], lambda(x) {return (x mod 2 == 0)}); 

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

@x = 0;

function incrementX() { x = x + 1;}

incrementX(); // x now equals 1

, Который не походит на много, но что, если это было всем в другой функции и Вы передали incrementX внешней функции?

function foo()
 { @x = 0;

   function incrementX() 
    { x = x + 1;
      return x;
    }

   return incrementX;
 }

@y = foo(); // y = closure of incrementX over foo.x
y(); //returns 1 (y.x == 0 + 1)
y(); //returns 2 (y.x == 1 + 1)

Это - то, как Вы получаете объекты с сохранением информации в функциональном программировании. Начиная с именования "incrementX" не необходим, можно использовать лямбду в этом случае:

function foo()
 { @x = 0;

   return lambda() 
           { x = x + 1;
             return x;
           };
 }
172
ответ дан Mark Cidade 20 July 2012 в 17:18
поделиться

Не все закрытия являются лямбдами, и не все лямбды закрытия. Оба - функции, но не обязательно таким образом мы привыкли знать.

лямбда А является по существу функцией, которая определяется встроенная, а не стандартный метод объявления функций. Лямбды могут часто раздаваться как объекты.

закрытие А является функцией, которая включает ее окружающее состояние путем ссылки на поля, внешние к ее телу. Вложенное состояние остается через вызовы закрытия.

На объектно-ориентированном языке, закрытия обычно обеспечиваются через объекты. Однако некоторые языки OO (например, C#) реализуют специальную функциональность, которая ближе к определению закрытий, обеспеченных просто функциональные языки (такие как шепелявость), которые не имеют объектов включить состояние.

то, Что интересно, - то, что введение Лямбд и Закрытия в C# приближают функциональное программирование к основному использованию.

52
ответ дан Honest Abe 20 July 2012 в 17:18
поделиться
Другие вопросы по тегам:

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