此page下面显示的代码段说明了使用发送消息,我遇到问题的一个问题是judge(Pid, Band, Album) ->
函数调用的receive子句中的第二个参数{} {1}}?
变量{Pid, Criticism} -> Criticism
的目的是什么?
下面是片段:
Criticism
答案 0 :(得分:2)
这不是第二个参数,它只是收到消息的一部分。阅读模式匹配,例如here或here,因为它是Erlang中非常重要的概念。
当某个具有PID P1
的进程From ! {self(), "Simply incredible."}
和From
是运行judge
的进程的PID时,{P1, "Simply incredible."}
与模式匹配{ {1}},以便{Pid, Criticism}
绑定到Pid
,P1
绑定到Criticism
。
答案 1 :(得分:2)
我们假设我们有一个erlang:receive/0
函数可以在邮箱中选择 first 消息并将其返回。然后我们可以重写receive
如下*:
case erlang:receive() of
{Pid, Criticism} ->
Criticism
end.
这里的要点是receive
表达式可以被认为是case
的变体,它从进程邮箱中获取其输入。因此,我们可以使用模式匹配来分解消息,就像我们在case
表达式中的任何其他术语一样。
当发件人使用send(!
)运算符将消息传递给进程时,消息(任何Erlang术语)基本上都会复制到进程邮箱中,从中可以使用{{1 }}
*请注意,我们的虚构receive
不提供跳过与所需模式不匹配的消息的工具,也不提供超时。此外,如果消息与任何case子句都不匹配,则进程将因receive/0
错误而崩溃。普通case_clause
表达式不是这种情况。