我正在努力学习二郎。这是一个计算平方面积的基本服务器。它是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的平方?
答案 0 :(得分:2)
这里发生的事情是,在第二轮Area
已经有限。
当你这样做时:
recieve Area -> Area end.
第一个Area
接收值,第二个Area
将值绑定到变量(Area
)。因此,在第一次调用Area
与100
值绑定后
您可能已经知道,Erlang是一种单一的分配语言。有关详细信息,请参阅this和this。
当您使用相同的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)
。