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