【问题标题】:Guards within receive接收内的守卫
【发布时间】:2014-08-24 12:29:47
【问题描述】:

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

【问题讨论】:

  • guessed 这里是原子而不是整数

标签: erlang


【解决方案1】:

你可能在那里有点困惑。你在做的事情是将原子guessed 与接收到的东西进行比较,并且与N 变量进行模式匹配。根据N 的类型及其值,您将获得truefalse。我猜N 通常是一些数字,如果你是look at comparison in 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.

所以你可以看到,只有当我们收到与第一次调用loop 相同的号码时,第一次接收才会执行(我们称之为模式匹配)。

对于其他接收,我们将接收到的编号绑定到N,然后将其与保留为进程状态的SecreteNumber 进行比较。

当然,我们将消息发送回User (pid),我们从中收到了猜测。所以模式中的User 将分配一个值,并且与我们发回响应的User 相同。

希望对您有所帮助。

【讨论】:

  • 感谢百万英里/分钟让我直截了当,我让它直接工作。祝你有美好的一天!
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 2017-11-27
  • 2013-03-31
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多