【问题标题】:How to receive on a list of possible values in erlang or elixir如何在 erlang 或 elixir 中接收可能值列表
【发布时间】:2020-09-30 19:42:19
【问题描述】:

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

例如我想写类似的东西

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

【问题讨论】:

  • 如果你提供一个更详细的例子来说明你想如何使用它,也许我们可以给你一个更量身定制的想法。

标签: erlang elixir erlang-otp


【解决方案1】:

在 Erlang 中,守卫仅限于在 here 中看到的守卫(没有列表:成员/2) 鉴于邮箱中的每封邮件都会进行匹配,我想说只允许在那里进行简单检查是有意义的。

我在这里看到两个选项:

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

【讨论】:

    【解决方案2】:

    你可以试试

    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.
    

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 2018-08-13
      • 2018-01-05
      • 1970-01-01
      • 2017-08-07
      • 2020-05-28
      • 2017-01-24
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多