каково официальное определение закрытия? и зависит ли это от языка программирования? - PullRequest
0 голосов
/ 30 апреля 2019

По словам моего профессора, замыкание - это значение функции в функциональном языке программирования.Но когда я погуглил его, я увидел другое определение, которое гласило:

Закрытие - это функция, имеющая доступ к родительской области, даже после того, как родительская функция закрылась.

Какой из них правильный?

1 Ответ

0 голосов
/ 23 мая 2019

Определение, которое вы нашли в Интернете, является правильным.

Вот какой-то псевдокод:

i = 1

def foo(j: Int) = {
  k = 2
  return i + j + k
}

foo(42) // returns 43; value of "i" is preserved inside the function

Функция foo добавляет значения переменных i, j и k. Переменная j является аргументом функции, а переменная k является локальной переменной, определенной внутри тела функции. Но переменная i приходит извне и называется свободной переменной .

Закрытие - это любая функция, которая "закрывает" одну или несколько свободных переменных . Локальные переменные и аргументы функции больше не нужны после завершения функции, что означает, что весь кадр стека, в котором функция хранит свои переменные, может быть извлечен. Но наличие свободной переменной означает, что кадр стека необходимо сохранить в ОЗУ для будущего использования.

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

// some languages, e.g. Javascript:
foo(42) // 43
i = 2
foo(42) // 43

// other languages, e.g. Scala:
foo(42) // 43
i = 2
foo(42) // 44

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

...