我在接收中遇到了一个问题,因为我是Erlang的新手,我已经阅读了我能找到的所有内容,但没有任何内容让我更清楚。
这里的问题是它从不检查第二名后卫,我不明白为什么。
我写的警卫错了吗?有另一种方式吗?
receive
{ask, {guessed, N}, User} when guessed < N ->
From ! {answer, {wrong, N, lower}},
main_loop(N, update(wrong, Stats));
{ask, {guessed, N}, User} when guessed > N ->
From ! {answer, {wrong, N, higher}},
main_loop(N, update(wrong, Stats));
end.
答案 0 :(得分:5)
你可能会在那里感到困惑。你在保护中做的是将原子guessed
与收到的东西和模式匹配的N
变量进行比较。根据{{1}}上的类型及其值,您将获得N
或true
。我猜false
通常是一些数字,如果你look at comparison in Erlang,那些将始终小于原子N
。
我认为你正在尝试做的事情是获得guessed
主持一些在给定过程中保留的价值(状态)。让我们称这个状态为N
。比你的SecretNumber
看起来像这样。
loop
因此,只有当我们收到与第一次调用loop( SecretNumber )
receive
%% neat pattern match, received same number as
{ask, {guessed, SecretNumber }, User} ->
User ! {answer, {right, SecretNumber}},
ok; % server will stop (finish)
{ask, {guessed, N}, User} when N < SecretNumber ->
User ! {answer, {wrong, N, lower}},
loop(SecretNumber);
{ask, {guessed, N}, User} when N > SecretNumber ->
User ! {answer, {wrong, N, higher}},
loop(SecretNumber)
end.
的号码相同的号码时,您才能看到第一次接收将执行(将按照我们称之为模式匹配)。
对于其他接收,我们将收到的号码绑定到loop
,然后将其与保留为流程状态的N
进行比较。
当然,我们会将消息发送回SecreteNumber
(pid),我们收到了猜测。因此,模式mach中的User
将分配一个值,并且与我们发送回复的User
相同。
希望得到这个帮助。