2010-07-17 2 views
8

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

Спасибо!

ответ

16

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

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

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

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

То же самое в Скале прекрасно работает и намного компактнее:

var x = 0 
val fun =()=>{x=1} 
fun 
+0

Это именно то, что я искал. Огромное спасибо! – northpole

+0

@Jesper: Нет, это не сработает, если я сделаю x final. Я бы просто получил другое сообщение об ошибке. ;) Я мог бы сделать x окончательным массивом int только с одним элементом ... –

+0

@Jesper, изменения, внесенные в содержимое массива 'final' из« Runnable », будут видны в каждой области видимости массива. –

2

Возможно, что громкоговоритель использовал «полностью питание», чтобы обозначать противоположность «закрытие», что является то, что many languages actually have.

1

Насколько я знаю, полноприводные закрытия не означают ничего особенного, но это может означать: простоту синтаксиса. Существует различие между новичком анонимного внутреннего класса в Java и использованием чего-то вроде (a => a < max). Возможно, способность создавать замыкания на всех окружающих переменных не только конечные.

+2

Этот пример не является закрытием (он не отображает никаких переменных из его контекста). Однако с примером, который использовал синтаксис более легкого веса и был закрытием, у вас был бы вполне правильный ответ (потому что я также подозреваю, что говорящий говорит о более легком использовании синтаксиса). – Richard

+0

@ Рихард: Хорошая точка - обновлено –

+0

@ Рихард, да, он говорил о том, чтобы делать что-то менее подробное было хорошо. – northpole

9

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

Во-вторых, замыкание является анонимной функцией, которая имеет переменную, которая не определена внутри функции (переменная/значение должно быть объявлено до определения функции). Термин «полное питание» может относиться к этой функции.

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 

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

+0

отличное объяснение, спасибо! – northpole

Смежные вопросы