Что такое закрытое питание? - PullRequest
8 голосов
/ 17 июля 2010

На днях я был на конференции по Java в Scala, и оратор упомянул «закрытие на полную мощность».Я с трудом нахожу определение, которое имеет смысл для меня.Я прочитал вики-страницу на замыканиях , но она мне действительно не ответила.Может кто-нибудь помочь мне с четким определением?Может быть, даже включить простой пример.

Спасибо!

Ответы [ 4 ]

16 голосов
/ 17 июля 2010

В информатике замыкание - это первоклассная функция со свободными переменными, которая связаны в лексической среде.

Вам не нужно больше, чем это предложение из статьи в Википедии. В Java отсутствует (в дополнение к уродливому синтаксису) возможность связывания свободных переменных извне замыкания. Пример:

int x = 0;
new Runnable() {
    public void run() {
        x = 1;
    }
}.run();

Здесь компилятор Java будет жаловаться на переменную x.

То же самое в scala работает просто отлично и гораздо менее многословно:

var x = 0
val fun = ()=>{x=1}
fun
9 голосов
/ 17 июля 2010

Поскольку я чувствую себя новичком (по сравнению с 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

Когда вы впервые увидите это, вы можете спросить, для чего он нужен.Короче говоря, он имеет много областей применения: -)

2 голосов
/ 17 июля 2010

Вполне возможно, что говорящий использовал слово «полный» для обозначения противоположности «подобному замыканию», что и есть во многих языках .

1 голос
/ 17 июля 2010

Насколько мне известно, полнофункциональные замыкания ничего особенного не значат, но могут означать простоту синтаксиса.Существует большая разница между обновлением анонимного внутреннего класса в Java и использованием чего-то вроде (a => a

...