erlang - 接收循环模式匹配问题

时间:2016-07-16 07:11:20

标签: erlang pattern-matching

我正在努力学习二郎。这是一个计算平方面积的基本服务器。它是erlang white paper

的示例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的平方?

1 个答案:

答案 0 :(得分:2)

这里发生的事情是,在第二轮Area已经有限。

当你这样做时:

recieve Area -> Area end.

第一个Area接收值,第二个Area将值绑定到变量(Area)。因此,在第一次调用Area100值绑定后 您可能已经知道,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)