我在接收中遇到了一个问题,因为我是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.
mpm.. 5
你可能会在那里感到困惑.你在保护中做的是将原子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.
因此,只有当我们收到与loop
第一次调用的号码相同的号码时,您才能看到第一次接收将执行(将模式匹配,因为我们称之为).
对于其他接收,我们将接收到的数字绑定到N
并将其与SecreteNumber
作为进程状态保存的数据进行比较.
当然我们发送消息给User
(pid)我们收到了猜测.因此,User
在模式中,mach将分配一个值,并且与User
发送响应相同.
希望这有帮助.
你可能会在那里感到困惑.你在保护中做的是将原子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.
因此,只有当我们收到与loop
第一次调用的号码相同的号码时,您才能看到第一次接收将执行(将模式匹配,因为我们称之为).
对于其他接收,我们将接收到的数字绑定到N
并将其与SecreteNumber
作为进程状态保存的数据进行比较.
当然我们发送消息给User
(pid)我们收到了猜测.因此,User
在模式中,mach将分配一个值,并且与User
发送响应相同.
希望这有帮助.