Я новичок в 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 , бар, ["Алиса"]}]}
. Обе функции spawn, которые принимают список параметров ( spawn / 3
и spawn / 4
), также принимают имя модуля. Но я не хочу экспортировать bar / 1
, потому что он используется только внутри и не требует вызова извне модуля.
Как я могу создать функцию с аргументами, не экспортируя ее?