【问题标题】:erlang - receive loop pattern matching issueerlang - 接收循环模式匹配问题
【发布时间】: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,它就可以工作。

标签: erlang pattern-matching


【解决方案1】:

这里发生的是第二次运行时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)

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2014-06-27
    • 2018-12-08
    • 2011-08-14
    • 2013-08-15
    • 2011-09-29
    相关资源
    最近更新 更多