确定Map是否具有某些键的正确方法

Mid*_*ire 3 elixir

我有一个必需的键列表(required_keys):

["artist", "track", "year"]
Run Code Online (Sandbox Code Playgroud)

和地图(参数):

%{"track" => "bogus", "artist" => "someone"}
Run Code Online (Sandbox Code Playgroud)

我想确定是否paramsrequired_keys.我来自Ruby背景并且迭代似乎对Elixir来说是错误的,但不确定如何进行模式匹配来做到这一点.

Dog*_*ert 5

使用Enum.all?/2Map.has_key?/2:

iex(1)> map = %{"track" => "bogus", "artist" => "someone"}
%{"artist" => "someone", "track" => "bogus"}
iex(2)> map2 = %{"track" => "bogus", "artist" => "someone", "year" => 2016}
%{"artist" => "someone", "track" => "bogus", "year" => 2016}
iex(3)> required_keys = ["artist", "track", "year"]
["artist", "track", "year"]
iex(4)> Enum.all?(required_keys, &Map.has_key?(map, &1))
false
iex(5)> Enum.all?(required_keys, &Map.has_key?(map2, &1))
true
Run Code Online (Sandbox Code Playgroud)

但不知道如何模式匹配来做到这一点

如果required_keys是动态的,则无法进行模式匹配.如果它是静态列表,您可以使用模式匹配:

iex(6)> match?(%{"artist" => _, "track" => _, "year" => _}, map)
false
iex(7)> match?(%{"artist" => _, "track" => _, "year" => _}, map2)
true
Run Code Online (Sandbox Code Playgroud)