Эликсир: захват остальной части карты с использованием соответствия шаблону
Я хочу, чтобы одновременно сопоставлять определенный ключ на карте, и захватывать остальную часть этой карты. Я надеялся, что это сработает:
iex(10)> %{"nodeType" => type | rest} = %{"nodeType" => "conditional", "foo" => "bar"}
** (CompileError) iex:10: cannot invoke remote function IEx.Helpers.|/2 inside match
Цель состоит в том, чтобы написать набор функций, которые принимают карту, сопоставление шаблонов на одном из полей карты и выполняют некоторые преобразования на остальной части карты.
def handle_condition(%{"nodeType" => "condition" | rest}) do
# do something with rest
done
def handle_expression(%{"nodeType" => "expression" | rest}) do
# do something with rest
done
Но похоже, что мне нужно, чтобы вызывающий передал nodeType отдельно, если я ничего не пропустил.
Ответы
Ответ 1
Вы можете легко захватить всю карту - возможно, этого будет достаточно?
def handle_condition(all = %{"nodeType" => "condition"}) do
# do something with all
end
Или:
def handle_condition(all = %{"nodeType" => "condition"}) do
all = Map.delete(all, "nodeType")
# do something with all
end
Ответ 2
Другим приятным способом достижения этого является использование Map.pop/2:
def handle(%{} = map), do: handle(Map.pop(map, "nodeType"))
def handle({"condition", rest}) do
# ... handle conditions here
end
def handle({"expression", rest}) do
# ... handle expressions here
end