2016-07-16 4 views
2

私はerlangを学びたいと考えています。ここに四角形の面積を計算する基本的なサーバーがあります。erlang - ループパターンマッチングの問題を受け取ります

-module(area_server). 
-export([start/0, loop/0]). 

start() -> 
    spawn(area_server, loop, []). 

loop() -> 
    receive 
     {Client, {square, X}} -> 
      Client ! X*X, 
      loop() 
    end. 

私が持っている問題は、私が唯一の1つの値にXをバインドできるようだということである:それはここではerlang white paper

の例6の改良版であるコードです。他の値へのバインドは機能しません。テストするために、私は次のコードを持っています:

Server = area_server:start(). 

%Works and returns 100 
Server ! {self(), {square, 10}}, receive Area -> Area end. 

%Does not work and just does not return at all 
Server ! {self(), {square, 5}}, receive Area -> Area end. 

私はどのように5の平方を計算できますか?

+2

したがって、問題はサーバー内ではなくクライアントコード内にあるようです。 'Area'という変数に受け取った後、一度100にバインドされた後、25にバインドすることはできません。したがって、2回目の呼び出しでArea1に変更すると動作します。 – arahant

答えて

2

ここで起こるのは、2回目の実行時にAreaが既にバインドされていることです。

あなたが行うと:

recieve Area -> Area end. 

最初Areaは値を受け取り、第二Area境界変数(Area)に値。したがって、最初の呼び出しの後にAreaは値100で囲まれます。
あなたがすでに知っているように、Erlangは単一のアシグメント言語です。詳細については、thisおよびthisを参照してください。

同じArea変数でこれを2回目に実行すると、一致するものがないため、receive呼び出しを待機します。送信する値は25ですが、受信内のAreaはすでに100にバインドされているため、一致しません。それがちょうどそこにぶら下がっている理由です。

あなたはこれが仕事をしたい場合は、たとえば関数を作成することができます

get_area(Server, Amount) -> 
    Server ! {self(), {square, Amount}}, receive Area -> Area end. 

そしてクライアントにだけget_area(Server, 10)またはget_area(Server, 5)を呼び出します。