erlang - 接收循环模式匹配问题
Posted
技术标签:
【中文标题】erlang - 接收循环模式匹配问题【英文标题】:erlang - receive loop pattern matching issue 【发布时间】:2016-11-19 09:51:19 【问题描述】:我正在努力学习 erlang。这是一个计算正方形面积的基本服务器。它是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 的平方呢?
【问题讨论】:
好的。所以看来问题不在于服务器,而在于客户端代码。因为我收到了一个名为Area
的变量,并且它被绑定到100 一次,之后它不能绑定到25。所以如果我在第二次调用中更改为Area1
,它就可以工作。
【参考方案1】:
这里发生的是第二次运行时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)
。
【讨论】:
以上是关于erlang - 接收循环模式匹配问题的主要内容,如果未能解决你的问题,请参考以下文章