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

ida*_*ray 2 elixir

我试图在Elixir中实现Modbus协议,作为练习Elixir和进一步理解功能编程的练习.

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

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

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

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

Ale*_*kin 9

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}
Run Code Online (Sandbox Code Playgroud)

另一方面,您的数据看起来和嘎嘎更像Keyword列表:

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

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