接待中的守卫

use*_*127 0 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.
Run Code Online (Sandbox Code Playgroud)

mpm*_*mpm 5

你可能会在那里感到困惑.你在保护中做的是将原子guessed与接收到的东西进行比较,并将模式匹配N变量.根据类型N和它的价值,你会得到truefalse.我想这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发送响应相同.

希望这有帮助.