接待中的守卫

时间:2014-07-03 11:40:03

标签: erlang

我在接收中遇到了一个问题,因为我是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.

1 个答案:

答案 0 :(得分:5)

你可能会在那里感到困惑。你在保护中做的是将原子guessed与收到的东西和模式匹配的N变量进行比较。根据{{​​1}}上的类型及其值,您将获得Ntrue。我猜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相同。

希望得到这个帮助。