如何在Erlang中为接收调用编写一个简单的while循环

时间:2014-03-22 00:16:21

标签: functional-programming erlang

我正在迭代来自接听电话的列表。

{ok, Pid} = riakc_pb_socket:start_link("server", 8087).
riakc_pb_socket:ping(Pid).
riakc_pb_socket:stream_list_keys(Pid, <<"test">>).
%% while receive, repeat this:
receive Msg1 -> Msg1 end.
{_, {_, List}} = Msg1.
lists:map(fun(K) ->  riakc_pb_socket:delete(Pid, <<"test">>, K) end, List).

我想知道我是否可以编写一个简单的循环,直到接收返回任何内容。我还重新学习了Erlang shell不允许你定义函数,所以我正在研究非shell版本。

1 个答案:

答案 0 :(得分:2)

要获得某种while循环,您需要使用递归,因为单独的接收不是循环累积消息。 receive然后循环收件箱。也就是说,它尝试获取与提供的模式相对应的第一条消息(此处为Msg1)。

所以你必须做这样的事情

gather (0, Acc) ->
    lists:reverse(Acc);  && Just Acc if you don't care about the order.
gather (N, Acc) ->
    receive
        Msg1 -> gather(N -1, [Msg1|Acc])
    end.
gather(10). %% If you are waiting for 10 messages.