如何在erlang或elixir中接收可能的值列表?

问题描述 投票:0回答:1

是否可以有一个动态的值列表,可以用在erlang接收块的防护中。

例如,我想写这样的内容

receive
  {Ref, Message} when Ref in [Refs]  ->
    %% Do stuff
erlang elixir otp
1个回答
1
投票

在Erlang中,守卫的范围仅限于在 此处 (no lists:member2)考虑到匹配是针对邮箱中的每条消息运行的,我认为只允许在那里进行简单的检查是合理的。

我在这里看到两个选项。

  1. 将不需要的邮件添加到 队列 中的状态,并在需要的时候(当有不同子句的receive时)在receive之前检查该队列。
  2. 在消息中加入一些标签,只接收有匹配标签的消息。
receive {Ref, Tag, Message} when Tag == State#st.listen_tag -> ...

0
投票

你可以尝试

receive 
  {Ref, Message} when is_reference(Ref) ->
    handle_message( lists:member(Ref, Refs), Message );
  ...

handle_message/2 可实现为

handle_message(true, Message) ->
  %% do stuff
  ;

handle_message(false, Message) ->
  ignore.
© www.soinside.com 2019 - 2024. All rights reserved.