2016-07-16 35 views
2

我想學習erlang。這是計算平方面積的基本服務器。它的erlang white papererlang - 接收環路模式匹配問題

這裏例如6的修改版本的代碼是:

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

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

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

我的問題是,它似乎我可以綁定X到只有一個值。綁定到任何其他值不起作用。要測試,我有以下代碼:

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.因此,如果我在第二次調用中更改爲'Area1',它將起作用。 – arahant

回答

2

這裏發生的是第二次運行Area已經有界。

這樣做:

recieve Area -> Area end. 

第一Area接收值,並且所述第二Area界限值給變量(Area)。因此在第一次調用Area後,其值爲100。你可能已經知道,Erlang是一種單一的轉換語言。有關更多信息,請參閱thisthis

當您第二次使用相同的Area變量運行此變量時,它將等待receive調用,因爲沒有匹配。您發送的值是25,但接收內部的Area已被限制爲100,因此沒有匹配。這就是它掛在那裏的原因。

如果你想要這個工作,你可以創建例如功能:

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

然後在客戶端只需要調用get_area(Server, 10)get_area(Server, 5)