см. выше:
сначала контейнер будет пытаться index.html, и если он не существует, то он попытается выполнить index.jsp.
blockquote>В моем приложении всегда используется index.html, когда есть index.jsp, index.html, независимо от конфигурации конфигурации.
лямбда является просто анонимной функцией - функция, определяемая без имени. На некоторых языках, таких как Схема, они эквивалентны именованным функциям. На самом деле функциональное определение переписывается как привязка лямбды к переменной внутренне. На других языках, как 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.
Это, как Вы замечаете, не имеет никакого отношения лямбда с - им отличающиеся два года (хотя связано) понятия.
Когда большинство людей думает функции , они думают именованные функции :
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;
};
}
Не все закрытия являются лямбдами, и не все лямбды закрытия. Оба - функции, но не обязательно таким образом мы привыкли знать.
лямбда А является по существу функцией, которая определяется встроенная, а не стандартный метод объявления функций. Лямбды могут часто раздаваться как объекты.
закрытие А является функцией, которая включает ее окружающее состояние путем ссылки на поля, внешние к ее телу. Вложенное состояние остается через вызовы закрытия.
На объектно-ориентированном языке, закрытия обычно обеспечиваются через объекты. Однако некоторые языки OO (например, C#) реализуют специальную функциональность, которая ближе к определению закрытий, обеспеченных просто функциональные языки (такие как шепелявость), которые не имеют объектов включить состояние.
то, Что интересно, - то, что введение Лямбд и Закрытия в C# приближают функциональное программирование к основному использованию.