如何在Erlang或Elixir中接收关于可能值的列表

8mmmxcuj  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(188)

是否可以有一个动态的值列表,可以在Erlang接收块的保护中使用。
例如,我想写这样的内容

receive
  {Ref, Message} when Ref in [Refs]  ->
    %% Do stuff
wxclj1h5

wxclj1h51#

在Erlang中,守卫仅限于此处所示的那些(no lists:member/2)。鉴于对邮箱中的每封邮件都运行匹配,我认为只允许简单检查是有意义的。
这里有两个选项:
1.将不需要的消息添加到状态为的queue中,并在需要时检查接收之前的队列(当存在具有不同子句的接收时)。
1.在消息中包含一些标记,以便仅接收具有匹配标记的消息:

receive {Ref, Tag, Message} when Tag == State#st.listen_tag -> ...
ojsjcaue

ojsjcaue2#

你可以试试

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.

相关问题