我正在尝试在Elixir中实施Modbus协议,作为练习Elixir和进一步理解功能编程的练习。
Modbus数据被建模为连续的寄存器块。 modbus读取请求采用以下形式。这指示服务器收集从寄存器开始并继续寄存器的寄存器。例如,如果为0且为5,则服务器将返回寄存器0,1,2,3和4的值。
我认为用于建模这些寄存器的良好数据结构是一个映射,其中键是寄存器,值是寄存器的值。因此,我很好奇是否有一种习惯的方法从给定多个键的映射中检索多个值,而不必遍历键并为每个键调用get()。
如果地图不合适,我会接受其他更好的数据模型建议。
Python在运算符模块中有itemgetter来执行此任务。也许这将为我想要完成的事情提供另一条线索。
答案 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]
您可以选择上述任何一项,甚至可以使用方便的方法提供自己的结构来检索子集。