У меня есть список необходимых ключей (required_keys):

["artist", "track", "year"]

И карта (параметры):

%{"track" => "bogus", "artist" => "someone"}

И я хочу определить, есть ли у params required_keys. Я исхожу из фона Ruby, и повторение кажется неправильным для Elixir, но не знаю, как для этого сопоставить шаблон.

3
Midwire 21 Апр 2016 в 19:31

3 ответа

Лучший ответ

Используйте Enum.all?/2 и Map.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

но не уверен, как сопоставить шаблон для этого

Сопоставление с образцом невозможно, если required_keys является динамическим. Если это статический список, вы можете использовать сопоставление с образцом:

iex(6)> match?(%{"artist" => _, "track" => _, "year" => _}, map)
false
iex(7)> match?(%{"artist" => _, "track" => _, "year" => _}, map2)
true
5
Dogbert 21 Апр 2016 в 16:46
requireds = ["artist", "track", "year"]
params = %{"track" => "bogus", "artist" => "someone"}
Enum.all?( requireds, fn(k) -> Map.has_key?(params, k) end) # => false
requireds = ["artist", "track"]
Enum.all?( requireds, fn(k) -> Map.has_key?(params, k) end) # => true

Или с сопоставлением с образцом:

def has_required_params?(%{"artist" => _, "track" => _, "year" => _}), do: true
def has_required_params?(_), do: false

has_required_params?(%{"track" => "bogus", "artist" => "someone"}) # => false
has_required_params?(%{"track" => "bogus", "artist" => "someone", year => "2000"}) # => true
1
Jason Harrelson 21 Апр 2016 в 17:09

Использование in вместо Map.has_key?:

def contains_fields?(keys, fields), do: Enum.all?(fields, &(&1 in keys))

Из https://elixirschool.com/en/lessons/specifics/plug/

0
LowFieldTheory 1 Дек 2019 в 16:41