Порождает функции, не экспортируя их - PullRequest
13 голосов
/ 03 августа 2011

Я новичок в erlang и у меня немного болит голова по следующему сценарию:

Возьмите этот код:

-module (so).
-export ( [foo/0] ).

bar () ->
    receive 
        die -> ok;
        Msg -> io:format ("I say ~p.~n", [Msg] )
    end.


bar (Name) ->
    receive 
        die -> ok;
        Msg -> io:format ("~s says ~p.~n", [Name, Msg] )
    end.

foo () ->
    Bar = spawn (fun bar/0),
    Bar ! "Hello",
    Bar ! die,
    Baz = spawn (?MODULE, bar, ["Alice"] ), % bar/1 not exported
    Baz ! "Hello",
    Baz ! die.

Процесс, порожденный spawn/1, работает нормально, новторой процесс, порожденный spawn/3, завершается неудачно, как и ожидалось, потому что я не экспортировал bar/1 и, следовательно, получаю {undef,[{so,bar,["Alice"]}]}.Обе функции вызова, которые принимают список параметров (spawn/3 и spawn/4), также принимают имя модуля.Но я не хочу экспортировать bar/1, потому что он используется только для внутреннего использования, и его не нужно вызывать извне модуля.

Как я могу создать функцию с аргументами без ее экспорта?

1 Ответ

21 голосов
/ 03 августа 2011

Вы можете просто сделать звонок внутри другого fun вот так:

spawn(fun() -> bar("alice") end)
...