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

Posted

技术标签:

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

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

例如我想写类似的东西

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

【问题讨论】:

如果你提供一个更详细的例子来说明你想如何使用它,也许我们可以给你一个更量身定制的想法。 【参考方案1】:

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

我在这里看到两个选项:

    将不需要的消息添加到状态中的queue,并在需要时在接收之前检查该队列(当接收带有不同子句时)。 在消息中包含一些标签以仅接收具有匹配标签的消息:
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.

【讨论】:

以上是关于如何在 erlang 或 elixir 中接收可能值列表的主要内容,如果未能解决你的问题,请参考以下文章

混合 Elixir 和 Erlang?

在 Elixir 或 Erlang 中,如何在运行时动态创建和加载模块?

如何在Elixir或Erlang中在运行时动态创建和加载模块?

Elixir重命名并包装Erlang模块?

如何在服务器上正确安装 Erlang、Elixir 和 mix?

Erlang - Elixir:啥是监督树?