2014-07-03 58 views
0

由於我是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

'猜到'這裏是一個原子不是一個整數 – bjhaid

回答

5

在這裏你可能會有些困惑。你在做什麼你的後衛比較原子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在模式mach中會分配一個值,並且與我們發回的響應相同User

希望得到這個幫助。

+1

感謝百萬mpm的設置我直,我直接工作。祝你有美好的一天! – user1501127