0

本页下面显示的片段说明了发送消息的使用,我无法理解的一件事是judge(Pid, Band, Album) ->函数调用的接收子句中的第二个参数 where {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 中是一个非常重要的概念。

当某个具有 PID 的进程P1确实From ! {self(), "Simply incredible."}并且From是正在运行的进程的 PID 时judge,则{P1, "Simply incredible."}与模式匹配{Pid, Criticism},因此Pid绑定到P1,并且Criticism绑定到"Simply incredible."

于 2013-03-09T05:27:06.593 回答
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 回答