使用Elixir中的Map中的多个键选择多个项目

时间:2016-11-14 23:49:46

标签: elixir

我正在尝试在Elixir中实施Modbus协议,作为练习Elixir和进一步理解功能编程的练习。

Modbus数据被建模为连续的寄存器块。 modbus读取请求采用以下形式。这指示服务器收集从寄存器开始并继续寄存器的寄存器。例如,如果为0且为5,则服务器将返回寄存器0,1,2,3和4的值。

我认为用于建模这些寄存器的良好数据结构是一个映射,其中键是寄存器,值是寄存器的值。因此,我很好奇是否有一种习惯的方法从给定多个键的映射中检索多个值,而不必遍历键并为每个键调用get()。

如果地图不合适,我会接受其他更好的数据模型建议。

Python在运算符模块中有itemgetter来执行此任务。也许这将为我想要完成的事情提供另一条线索。

1 个答案:

答案 0 :(得分:8)

Map#take/2可以:

iex(1)> data = %{a: 42, b: 3.14, foo: :bar}
iex(2)> data |> Map.take(~W|a foo|a) 
%{a: 42, foo: :bar}

另一方面,您的数据看起来更像是Keyword list

iex(3)> data = [a: 42, b: 3.14, foo: :bar]
iex(4)> data |> Keyword.take([:a, :foo]) 
[a: 42, foo: :bar]

您可以选择上述任何一项,甚至可以使用方便的方法提供自己的结构来检索子集。