Erlang 在接收范围内的警卫

Erlang 在接收范围内的警卫,erlang,Erlang,我有一个问题,在接收守卫,因为我是新来的二郎,我已经阅读了所有我能找到的关于这一点,但没有让我更清楚 这里的问题是它从不检查第二个守卫,我不明白为什么 我写错警卫了吗?还有别的办法吗 receive {ask, {guessed, N}, User} when guessed < N -> From ! {answer, {wrong, N, lower}}, main_loop(N, update(wrong, Stats));

我有一个问题,在接收守卫,因为我是新来的二郎,我已经阅读了所有我能找到的关于这一点,但没有让我更清楚

这里的问题是它从不检查第二个守卫,我不明白为什么

我写错警卫了吗?还有别的办法吗

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.
接收
{提问,{猜测,N},用户}当猜测
从…起{回答,{错,N,下},
主循环(N,更新(错误,统计数据));
{提问,{猜测,N},用户}当猜测>N->
从…起{回答,{错了,N,更高},
主循环(N,更新(错误,统计数据));
结束。

你可能会有点困惑。你在守卫中做的是将atom
猜测的
与接收到的内容进行比较,并将模式匹配到
N
变量。根据
N
上的类型及其值,您将得到
true
false
。我猜
N
通常是一个数字,如果你和那些人总是比atom
guessed

我想你们要做的是,comperereceived
N
,在给定的过程中保留一些值(状态)。让我们调用此状态
SecretNumber
。比您的
循环
看起来更像这样

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.
循环(SecretNumber)
接收
%%整齐的图案匹配,收到的编号与
{ask,{猜测,SecretNumber},User}->
用户!{回答,{对,SecretNumber}},
好的;%服务器将停止(完成)
当N
用户!{回答,{错,N,下},
循环(SecretNumber);
{ask,{猜测,N},用户}当N>SecretNumber->
用户!{回答,{错了,N,更高},
循环(SecretNumber)
结束。
因此,您可以看到,只有当我们接收到与第一次调用
loop
的编号相同的编号时,才会执行first receive(我们称之为模式匹配)

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

当然,我们将消息发回给
用户
(pid),从中我们收到了猜测。因此,模式中的
User
马赫将分配一个值,并向相同的
User
发送响应


希望这对你有所帮助。

你可能会有点困惑。你在守卫中做的是将atom
猜测的
与接收到的内容进行比较,并将模式匹配到
N
变量。根据
N
上的类型及其值,您将得到
true
false
。我猜
N
通常是一个数字,如果你和那些人总是比atom
guessed

我想你们要做的是,comperereceived
N
,在给定的过程中保留一些值(状态)。让我们调用此状态
SecretNumber
。比您的
循环
看起来更像这样

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.
循环(SecretNumber)
接收
%%整齐的图案匹配,收到的编号与
{ask,{猜测,SecretNumber},User}->
用户!{回答,{对,SecretNumber}},
好的;%服务器将停止(完成)
当N
用户!{回答,{错,N,下},
循环(SecretNumber);
{ask,{猜测,N},用户}当N>SecretNumber->
用户!{回答,{错了,N,更高},
循环(SecretNumber)
结束。
因此,您可以看到,只有当我们接收到与第一次调用
loop
的编号相同的编号时,才会执行first receive(我们称之为模式匹配)

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

当然,我们将消息发回给
用户
(pid),从中我们收到了猜测。因此,模式中的
User
马赫将分配一个值,并向相同的
User
发送响应


希望这能帮上忙。

非常感谢你以百万英里的速度纠正我的错误,我直接让它工作起来了。祝你有美好的一天!非常感谢你让我明白过来,我让它直接工作了。祝你今天愉快<代码>猜测这里是一个原子而不是整数
猜测
这里是一个原子而不是整数