2017-01-14 1 views
4

Dictモジュールは、Elixir v1.2以降、ソフト非推奨となりました。我々は1.4で、今だと、それは警告を発生させます:Dict.mergeは推奨されていません。キーワードリストとマップをマージする最も簡単な方法は何ですか?

Dict.merge/2が推奨されていません

、キーワードリスト

Dictのを操作するためのマップまたはキーワードモジュールを操作するためのマップモジュールを使用しています。マージは次のように使用されました:

iex(1)> animals_keyword_list = [cats: 2, dogs: 1] 
[cats: 2, dogs: 1] 
iex(2)> animals_map = %{cats: 3, rabbits: 1} 
%{cats: 3, rabbits: 1} 
iex(3)> Dict.merge(animals_map, animals_keyword_list) 
%{cats: 2, dogs: 1, rabbits: 1} 

単純なキーワードリストを処理する最善の方法は何ですか?

答えて

9

両方MapKeywordEnumerableCollectableプロトコルを実装するので、私たちはEnum.into/2を使用することができます。

iex(4)> animals_keyword_list |> Enum.into(animals_map) 
%{cats: 2, dogs: 1, rabbits: 1} 

注、この解決策は、最後の、重複キーがキーワードリストにあるかどうかということ幸せにする必要がありますマップは重複キーを持つことができないので、宣言されたものはそれ以前のものを無効にします。

iex(5)> animals_map |> Enum.into(animals_keyword_list) 
[cats: 2, dogs: 1, cats: 3, rabbits: 1] 
1

代わりのDict.merge/2あなたは、単にMap.merge/2を使用する必要があります:あなたの代わりに逆の操作を行うと、重複キーをサポートすることができ、キーワードリストの中に地図をマージするときは、これを見ることができます。

map1 = %{name: "bob"} 
map2 = %{name: "fred", wife: "wilma"} 
Map.merge(map1, map2) # %{name: "fred", wife: "wilma"} 

キーワードリストと同じルールがKeyword.merge/2です。

キーワードリストには、Map.merge/2Enum.intoを使用します。

Map.merge(animal_map, Enum.into(animal_keyword_list, %{})) 

のみMapモジュール使用:これは動作しますが、より多くの冗長単に一人でEnum.intoを使用するよりもあるでしょう

Map.merge(animal_map, Map.new(animal_keyword_list)) 
+0

を。私はElixirの組み込みプロトコルに頼ることは、これについてもっと慣れ親しんだ方法だと言います。 –

関連する問題