2016-11-14 3 views
1

Elixirを学習し、Functional Programmingをさらに理解するための練習として、ModbusプロトコルをElixirに実装しようとしています。Elixirのマップから複数のキーを使用して複数のアイテムを選択

Modbusデータは、連続したレジスタブロックとしてモデル化されています。 modbusの読み取り要求はの形式をとる。これは、サーバがレジスタから開始してレジスタを収集するようにサーバに指示します。たとえば、0で5だった場合、サーバーはレジスタ0,1,2,3、および4の値を返します。

これらのレジスタをモデリングするための優れたデータ構造は、 keyはレジスタ、valueはレジスタの値です。したがって、複数のキーが指定されたマップから複数の値を取得する慣用的な方法がある場合は、キーを繰り返し処理したり、各キーに対して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がまさに私が必要としていたものだと思います。私はドキュメントの間違った部分で検索していたオブジェクト指向言語にとても慣れています。私は本当に指摘していただきありがとうございます。また、Keyはレジスタ番号でなく、原子でなければならないので、Keywordリストは私のためにそれを行うとは思わない。 – idahogray

関連する問題