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.