Ранее я писал о замыканиях в 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. Наслаждаться!