Ранее я писал о замыканиях в JavaScript. К моему удивлению, я обнаружил, что делегирование функции в модулях приложения Erlang также обеспечивает закрытие. — И что, опять закрытие? Замыкание — это первоначальная область действия функции, которая сохраняется, даже если она была передана какой-либо другой части приложения через делегат. Из-за закрытия функция по-прежнему будет иметь доступ к переменным, которые у нее были изначально, независимо от того, откуда она выполняется, она по-прежнему сможет использовать эти переменные (фактически, что угодно).
Давайте посмотрим на то же самое на примере: здесь AnoFun — это делегат анонимной функции, у которой есть входной аргумент AA, который является локальной переменной для этой функции, а BB будет внешней переменной, к которой у нее будет доступ. Теперь у нас есть еще одна функция ext_fun(AnoFun, AA), которая берет делегата AnoFun и выполняет его со своим входным параметром AA. Понятно, что когда AnoFun выполняется изнутри ext_fun(), AnoFun при выполнении все еще может получить доступ к BB, который на самом деле внутри функции start(). Просто взгляните на пример, если вы устали от такого количества образования.
Довольно простой пример:
% hello world program -module(helloworld). -export([start/0,ext_fun/2]). start() -> BB = "THIS IS BB.", AnoFun = fun(AA) -> AA ++ BB end, RES = ext_fun(AnoFun, "THIS IS AA."), io:fwrite("RES = ~p~n", [RES]). ext_fun(AnoFun, AA) -> AnoFun(AA).
Выход:
$erlc *.erl $erl -noshell -s helloworld start -s init stop RES = "THIS IS AA.THIS IS BB."
Таким образом, мы можем сказать, что делегат AnoFun все еще сохранял свою первоначальную область видимости, даже когда он передавался во внешнюю функцию и выполнялся из внешней функции.
Надеюсь, это дает некоторое представление о замыкании в Erlang. Наслаждаться!