2016-11-14 47 views
1

我试图在Elixir中实施Modbus协议作为学习Elixir的练习并进一步理解函数式编程。使用Elixir中的多个键选择多个项目

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

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

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

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

+0

你的代码在哪里?请在这里发布。 – Sachith

+0

我在想这更像是一个哲学问题,而不是代码问题。我可以用一些代码编辑我的问题,但将它花在一起需要一点时间。 – idahogray

回答

5

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] 

这取决于你选择的任何以上,甚至提供您自己的结构与方便的方法来检索子集。

+0

我认为Map.take正是我所需要的。我习惯于在文档的错误部分搜索OO语言。我非常欣赏这些指针。此外,我不认为关键字列表会为我做,因为密钥需要是一个注册号,而不是一个原子。 – idahogray