0

このページの下に示されているスニペットは、メッセージの送信の使用法を示しています。私が理解に苦しむことの 1 つは、judge(Pid, Band, Album) ->関数呼び出しの receive 句内の 2 番目の引数{Pid, Criticism} -> Criticismです。

変数の目的は何Criticismですか?

スニペットは次のとおりです。

start_critic() ->
   spawn(?MODULE, critic, []).

judge(Pid, Band, Album) ->
   Pid ! {self(), {Band, Album}},
    receive
     {Pid, Criticism} -> Criticism
    after 2000 ->
     timeout
end.

critic() ->
   receive
     {From, {"Rage Against the Turing Machine", "Unit Testify"}} ->
        From ! {self(), "They are great!"};
     {From, {"System of a Downtime", "Memoize"}} ->
        From ! {self(), "They're not Johnny Crash but they're good."};
     {From, {"Johnny Crash", "The Token Ring of Fire"}} ->
        From ! {self(), "Simply incredible."};
     {From, {_Band, _Album}} ->
        From ! {self(), "They are terrible!"}
end,
critic().
4

2 に答える 2

2

メールボックスの最初のメッセージを選択して返すerlang:receive/0関数があると想像してみてください。次に、次のように書き直すことができます*:receive

case erlang:receive() of
    {Pid, Criticism} ->
        Criticism
end.

ここでのポイントは、式は、プロセスメールボックスから入力を受け取るそのreceive変形と考えることができるということです。caseしたがって、パターンマッチングを使用して、式の他の用語と同じようにメッセージを分解できますcase

送信者がsend(!)演算子を使用してメッセージをプロセスに渡す場合、メッセージ(任意のErlang用語)は基本的にプロセスメールボックスにコピーされ、そこからを使用して取得できますreceive

*私たちの架空receive/0のものは、目的のパターンに一致しないメッセージをスキップする機能を提供しておらず、タイムアウトにも対応していないことに注意してください。また、メッセージがどのcase句とも一致しない場合、プロセスはcase_clauseエラーでクラッシュします。これは通常のreceive表現には当てはまりません。

于 2013-03-09T10:03:53.937 に答える
2

これは 2 番目の引数ではなく、受信したメッセージの一部です。Erlang ではパターン マッチングは非常に重要な概念であるため、パターン マッチングについてはこちらまたはこちらを参照してください。

PIDを持つプロセスが実行P1中のプロセスの PID である場合、パターンと照合されるため、それはにバインドされ、 にバインドされます。From ! {self(), "Simply incredible."}Fromjudge{P1, "Simply incredible."}{Pid, Criticism}PidP1Criticism"Simply incredible."

于 2013-03-09T05:27:06.593 に答える