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 - 接收循环模式匹配问题的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Erlang 中的模式匹配

Erlang 模式匹配顺序

在erlang中列出尾部模式匹配

Erlang中模式匹配字符串的正确方法

Erlang 映射中的模式匹配键

为啥 Erlang 中的模式匹配记录会抛出错误