我在编写函数子句时遇到问题,我需要对映射进行模式匹配,并保留它以便在函数中使用。我无法理解语法是什么。基本上我想要这样的东西:
def check_data (arg1, %{"action" => "action1", ...}, arg2) do
# access other keys of the structure
end
我确信这是非常基本的,但这似乎是在逃避我。我已经阅读了很多教程,但似乎找不到处理这个用例的教程。
答案 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"}