Сопоставление с образцом Enum.map и условие условия - PullRequest
0 голосов
/ 03 июля 2018

У меня есть эта карта:

%{
  "a" => "1",
  "b" => "2",
  "c" => "3",
  "d" => "4",
  "e" => %{"f" => "5"}
}

И я могу повторить значение ключа следующим образом:

Enum.map(map, fn({k, v}) ->  
  v
end)

Используя fn ({k, v}) как кортеж, и я получаю что-то вроде этого:

["1", "2", "3", "4", %{"f" => "5"}]

Но я не понимаю, почему это не работает:

Enum.map(map, fn({k, v}) ->  
  case v do
    {key, value} -> "inner map"
    _ -> "something else"
end)
["something else", "something else", "something else", "something else",
 "something else"]

Я могу сопоставить шаблон с картой fn({k, v}), но я не могу использовать то же сопоставление с шаблоном для условия случая?

Обновление

Вот что я пытаюсь

some = %{"a" => "1", "b" => "2", "c" => "3", "d" => "4", "e" => %{"f" => "5"}}
Enum.map(some, fn({k, v}) ->       
  case v do                        
    %{^condition => value} -> "inner map"
    _ "something else"
  end
end)
** (CompileError) iex:15: unknown variable ^condition. No variable "condition" has been defined before the current pattern
    (stdlib) lists.erl:1354: :lists.mapfoldl/3

1 Ответ

0 голосов
/ 03 июля 2018

{key, value} - это не карта , это кортеж . Вам нужно:

Enum.map(map, fn({k, v}) ->  
  case v do
    %{} = map -> "inner map: #{inspect map}"
    _ -> "something else"
  end
end)
#⇒ ["something else", "something else",
#   "something else", "something else",
#   "inner map: %{\"f\" => \"5\"}"]

Независимо от того, доказано ли существование ключа, можно напрямую сопоставить его значение с шаблоном (примечание закреплено key):

key = "f"
Enum.map(map, fn({k, v}) ->  
  case v do
    %{^key => v} -> "inner map with value: #{inspect v}"
    _ -> "something else"
  end
end)
#⇒ ["something else", "something else",
#   "something else", "something else",
#⇒  "inner map with value: \"5\""]
...