Подтвердить что ты не робот

Эликсир: захват остальной части карты с использованием соответствия шаблону

Я хочу, чтобы одновременно сопоставлять определенный ключ на карте, и захватывать остальную часть этой карты. Я надеялся, что это сработает:

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 отдельно, если я ничего не пропустил.

4b9b3361

Ответ 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