読者です 読者をやめる 読者になる 読者になる

spawn/3って、Module, Func, Argの引数のうち、Funcはexportしとかんといかんのかー

それでerlcでwarningが出るんだな。
でも、そうなると、receiveするだけのloopのFuncをexportすることになって、今ひとつ気分が良くないなぁ。
spawn/2 があればいいんだろうか?
すごくいまさらなところでハマってしまった。情けない。
(追記:exportの宣言を分けておく、という手を教えていただきました。なるほど、気持ちの問題としてはそれで十分かもしれません。有難うございました。)

ダメな例。loopをexportしていない

-module(hoge).
-export([start/0]).

start() ->
   spawn(hoge, loop, [[]]).

loop(State) ->
   receive
      {Pid, Cmd} ->
         io:format("~p", [Cmd]),
         Pid ! {done};
      _Any ->
         loop(State)
   end.
$ erlc -W hoge.erl
./hoge.erl:7: Warning: function loop/1 is unused

この場合、

spawn(?MODULE, loop, [[]]),

とかでもダメである。

エラーにはならない例。loopをexportしている

-module(hoge).
-export([start/0, loop/1]).

start() ->
   spawn(hoge, loop, [[]]).

loop(State) ->
   receive
      {Pid, Cmd} ->
         io:format("~p", [Cmd]),
         Pid ! {done};
      _Any ->
         loop(State)
   end.
$ erlc -W hoge.erl
$                              (何のwarningも出ない)

loopをexportしたくない場合

spawn/1を使い、loopの初期化をする関数を最初に呼び出す。

-module(hoge).
-export([start/0]).

start() ->
   spawn(fun() -> loop_init() end).

loop_init() ->
   loop([]).

loop(State) ->
   receive
      {Pid, Cmd} ->
         io:format("~p", [Cmd]),
         Pid ! {done};
      _Any ->
         loop(State)
   end.