Я был на конференции по Java по Scala на днях, и динамик упомянул 'полные приводимые в действие закрытия'. Мне нелегко закреплять определение, которое имеет смысл мне. Я прочитал страницу Wiki на закрытиях, но она действительно не ответила на это для меня. Кто-то может помочь мне с ясным определением? Возможно, даже включайте простой пример.
Спасибо!
В информатике замыкание - это функция первого класса со свободными переменными, которые связаны в лексической среде.
Вам не нужно больше, чем это предложение из статьи в Википедии. Чего не хватает Java (помимо уродливого синтаксиса), так это возможности связывания свободных переменных извне замыкания. Пример:
int x = 0;
new Runnable() {
public void run() {
x = 1;
}
}.run();
Здесь компилятор Java пожалуется на переменную x.
То же самое в scala работает отлично и намного менее многословно:
var x = 0
val fun = ()=>{x=1}
fun
Возможно, что динамик использовал слово «полная мощность» для обозначения противоположности «подобного замыканию», это то, что на самом деле есть во многих языках .
Насколько мне известно, закрытие с полным включением не означает ничего особенного, но может означать: простоту синтаксиса. Существует огромная разница между созданием анонимного внутреннего класса в Java и использованием чего-то вроде (a => a
Поскольку я чувствую себя новичком (по сравнению с DPP и Amber), я могу объяснить это новичку на языке новичков:
Во-первых, анонимная функция (или блок кода/лямбда-выражение) - это просто функция, у которой нет имени. Она может быть привязана к переменной следующим образом.
scala> val foo = (x: Int) => 2*x
foo: (Int) => Int = <function1>
scala> val bar = foo
bar: (Int) => Int = <function1>
scala> bar(5)
res2: Int = 10
Видите, у функции нет имени foo, она может быть вызвана из bar.
Во-вторых, закрытие - это анонимная функция, которая имеет переменную, не определенную внутри функции (переменная/значение должны быть объявлены до определения функции). Термин "полнофункциональное закрытие" может относиться к этой функции.
scala> var constant = 7
constant: Int = 7
scala> val foo = (x: Int) => 2*x + constant
foo: (Int) => Int = <function1>
scala> foo(5)
res3: Int = 17
scala> constant = 6
constant: Int = 6
scala> foo(5)
res4: Int = 16
Впервые увидев это, вы можете задаться вопросом, для чего оно нужно. Короче говоря, у него много сфер применения :-)