模式匹配映射为函数参数

时间:2016-09-27 09:23:25

标签: elixir

我在编写函数子句时遇到问题,我需要对映射进行模式匹配,并保留它以便在函数中使用。我无法理解语法是什么。基本上我想要这样的东西:

def check_data (arg1, %{"action" => "action1", ...}, arg2) do
  # access other keys of the structure
end

我确信这是非常基本的,但这似乎是在逃避我。我已经阅读了很多教程,但似乎找不到处理这个用例的教程。

1 个答案:

答案 0 :(得分:11)

要匹配地图的某些键并将整个地图存储在变量中,您可以使用= variable模式:

def check_data(arg1, %{"action" => "action1"} = map, arg2) do
end

此函数将匹配包含键"action1"(以及任何其他键/值对)中的"action"的任何地图作为第二个参数,并将整个地图存储在map中:

iex(1)> defmodule Main do
...(1)>   def check_data(_arg1, %{"action" => "action1"} = map, _arg2), do: map
...(1)> end
iex(2)> Main.check_data :foo, %{}, :bar
** (FunctionClauseError) no function clause matching in Main.check_data/3
    iex:2: Main.check_data(:foo, %{}, :bar)
iex(2)> Main.check_data :foo, %{"action" => "action1"}, :bar
%{"action" => "action1"}
iex(3)> Main.check_data :foo, %{"action" => "action1", :foo => :bar}, :bar
%{:foo => :bar, "action" => "action1"}