我在接收中遇到了一个问题,因为我是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.
Run Code Online (Sandbox Code Playgroud)
你可能会在那里感到困惑.你在保护中做的是将原子guessed与接收到的东西进行比较,并将模式匹配N变量.根据类型N和它的价值,你会得到true或false.我想这N通常是一些数字,如果你看一下Erlang中的比较,那些将始终小于原子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.
Run Code Online (Sandbox Code Playgroud)
因此,只有当我们收到与loop第一次调用的号码相同的号码时,您才能看到第一次接收将执行(将模式匹配,因为我们称之为).
对于其他接收,我们将接收到的数字绑定到N并将其与SecreteNumber作为进程状态保存的数据进行比较.
当然我们发送消息给User(pid)我们收到了猜测.因此,User在模式中,mach将分配一个值,并且与User发送响应相同.
希望这有帮助.