Что полным является приводимое в действие закрытие?

Я был на конференции по Java по Scala на днях, и динамик упомянул 'полные приводимые в действие закрытия'. Мне нелегко закреплять определение, которое имеет смысл мне. Я прочитал страницу Wiki на закрытиях, но она действительно не ответила на это для меня. Кто-то может помочь мне с ясным определением? Возможно, даже включайте простой пример.

Спасибо!

8
задан oluies 17 July 2010 в 21:19
поделиться

4 ответа

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

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

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

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

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

var x = 0
val fun = ()=>{x=1}
fun
16
ответ дан 5 December 2019 в 05:55
поделиться

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

2
ответ дан 5 December 2019 в 05:55
поделиться

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

1
ответ дан 5 December 2019 в 05:55
поделиться

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

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

9
ответ дан 5 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

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